12

2 つのリストから重複を削除しようとしています。だから私はこの関数を書きました:

a = ["abc", "def", "ijk", "lmn", "opq", "rst", "xyz"]

b = ["ijk", "lmn", "opq", "rst", "123", "456", ]

for i in b:
    if i in a:
        print "found " + i
        b.remove(i)

print b

しかし、一致したアイテムに続く一致するアイテムが削除されないことがわかりました。

次のような結果が得られます。

found ijk
found opq
['lmn', 'rst', '123', '456']

しかし、私は次のような結果を期待しています:

['123'、'456']

関数を修正して、やりたいことを実行するにはどうすればよいですか?

ありがとうございました。

4

11 に答える 11

28

あなたの問題は、反復しているリストを変更しているようです。代わりに、リストのコピーを反復処理します。

for i in b[:]:
    if i in a:
        b.remove(i)


>>> b
['123', '456']

しかし、代わりにリスト内包表記を使用するのはどうですか?

>>> a = ["abc", "def", "ijk", "lmn", "opq", "rst", "xyz"]
>>> b = ["ijk", "lmn", "opq", "rst", "123", "456", ]
>>> [elem for elem in b if elem not in a ]
['123', '456']
于 2013-08-12T19:20:03.940 に答える
25

どうですか

b= set(b) - set(a)

b結果および/または保持される順序で繰り返し表示される可能性のある繰り返しが必要な場合は、

b= [ x for x in b if not x in a ] 

するでしょう。

于 2013-08-12T19:24:48.023 に答える
4

リストの両方の重複を削除するように依頼しましたが、これが私の解決策です:

from collections import OrderedDict
a = ["abc", "def", "ijk", "lmn", "opq", "rst", "xyz"]
b = ["ijk", "lmn", "opq", "rst", "123", "456", ]

x = OrderedDict.fromkeys(a)
y = OrderedDict.fromkeys(b)

for k in x:
    if k in y:
        x.pop(k)
        y.pop(k)


print x.keys()
print y.keys()

結果:

['abc', 'def', 'xyz']
['123', '456']

ここでの良い点は、両方のリスト項目の順序を維持できることです

于 2013-08-12T19:26:55.487 に答える
3

またはセット

set(b).difference(a)

重要な場合、セットは順序を保持しないことに注意してください

于 2013-08-12T19:22:11.597 に答える
0

b「どうすれば修正できますか?」についてはすでに多くの回答があるため、これは「どうすれば改善し、より Pythonic になることができますか?」です。達成したいのは listと listの違いを取得することなのでa、集合に対して差分操作を使用する (集合に対する操作):

>>> a = ["abc", "def", "ijk", "lmn", "opq", "rst", "xyz"]
>>> b = ["ijk", "lmn", "opq", "rst", "123", "456", ]
>>> s1 = set(a)
>>> s2 = set(b)
>>> s2 - s1
set(['123', '456'])
于 2013-08-12T20:29:37.400 に答える