2012-11-23 52 views
4

我有一段代碼,這段代碼加載了2所列出:合併2所列出並刪除重複輸入

with open('blacklists.bls', 'r') as f: 
      L = [dnsbls.strip() for dnsbls in f] 
with open('ignore.bls', 'r') as f2: 
      L2 = [ignbls.stip() for ignbls in f2] 

dnsbls包含:

list1 
list2 
list3 

ignbls包含

list2 

我想要做的是合併dnsbls和ignbls,然後刪除任何出現多次的行,並用「for」打印。我的想法是這樣的:

for combinedlist in L3: 
      print combinedlist 

其中在aboe例子打印出:

list1 
list3 
+0

是否順序有關係嗎? – DSM

+0

我嘗試將dnsbls和ignbls的內容寫入文件,比如說list.temp,然後打開該文件。弄糊塗弄清楚如何刪除不止一次出現的每一行。 – MadsRC

+0

該訂單與當前項目無關,因此無需考慮 – MadsRC

回答

2

您需要使用sets代替列表:

L3 = list(set(L).difference(L2)) 

示範:

>>> L=['list1','list2','list3'] 
>>> L2=['list2'] 
>>> set(L).difference(L2) 
set(['list1', 'list3']) 
>>> list(set(L).difference(L2)) 
['list1', 'list3'] 

爲了您的目的,您可能不必將其再次轉換回列表,您可以遍歷結果集就好了。

+0

謝謝Martijn! – MadsRC

1

如果忽略比黑名單較小(這通常是我認爲的情況下),然後(未經測試):

with open('blacklists.bls') as bl, open('ignore.bls') as ig: 
    bl_for = (line.strip() for line in bl if 'for' not in line) 
    ig_for = (line.strip() for line in ig if 'for' not in line) 
    res = set(ig_for).difference(bl_for)