4

このコードで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

上記の例では、次のように出力されます。

list1
list3
4

2 に答える 2

2

リストの代わりにセットを使用する必要があります。

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']

あなたの目的のために、おそらくリストに再び変換する必要はありません。結果のセットをうまく反復処理できます。

于 2012-11-23T13:09:23.913 に答える
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)
于 2012-11-23T13:14:00.473 に答える