python从2个列表中删除重复项

mic*_*ael 9 python list duplicate-removal

我试图从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
Run Code Online (Sandbox Code Playgroud)

但我发现匹配项后面的匹配项不会被删除.

我得到这样的结果:

found ijk
found opq
['lmn', 'rst', '123', '456']
Run Code Online (Sandbox Code Playgroud)

但我希望结果如下:

['123','456']

如何修复我的功能来做我想要的?

谢谢.

7st*_*tud 30

这是正在发生的事情.假设你有这个清单:

['a', 'b', 'c', 'd']
Run Code Online (Sandbox Code Playgroud)

并且您循环遍历列表中的每个元素.假设您当前处于索引位置1:

['a', 'b', 'c', 'd']
       ^
       |
   index = 1
Run Code Online (Sandbox Code Playgroud)

...并删除索引位置1处的元素,为您提供:

['a',      'c', 'd']
       ^
       |
    index 1
Run Code Online (Sandbox Code Playgroud)

删除项目后,其他项目向左滑动,为您提供:

['a', 'c', 'd']
       ^
       |
    index 1
Run Code Online (Sandbox Code Playgroud)

然后当循环再次运行时,循环将索引递增为2,为您提供:

['a', 'c', 'd']
            ^ 
            |
         index = 2
Run Code Online (Sandbox Code Playgroud)

看看你如何跳过'c'?教训是:永远不要从循环的列表中删除元素.

  • 也许倒票的原因是缺乏可行的解决方案...... (5认同)
  • 这个答案包含了对问题原因的一个非常明确的解释,我不明白为什么它得到了反对票. (4认同)

Suk*_*lra 17

你的问题似乎是你正在改变你正在迭代的列表.迭代重复列表的副本.

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


>>> b
['123', '456']
Run Code Online (Sandbox Code Playgroud)

但是,如何使用列表理解呢?

>>> 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']
Run Code Online (Sandbox Code Playgroud)


Mar*_*ssi 13

关于什么

b= set(b) - set(a)
Run Code Online (Sandbox Code Playgroud)

如果您需要重复,b也会在结果和/或顺序中重复出现,那么

b= [ x for x in b if not x in a ] 
Run Code Online (Sandbox Code Playgroud)

会做.

  • 这个答案被低估了一次.任何人都能说出原因吗?任何严重的语法/概念错误?对提出的问题没有贡献(考虑到有时候很难理解被问到的问题)?英语不好到难以理解的程度? (2认同)

Ant*_*rot 6

您要求删除两个列表重复项,这是我的解决方案:

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()
Run Code Online (Sandbox Code Playgroud)

结果:

['abc', 'def', 'xyz']
['123', '456']
Run Code Online (Sandbox Code Playgroud)

这里的好处是您可以保持两个列表项的顺序