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'?教训是:永远不要从循环的列表中删除元素.
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)
会做.
您要求删除两个列表重复项,这是我的解决方案:
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)
这里的好处是您可以保持两个列表项的顺序
| 归档时间: |
|
| 查看次数: |
21525 次 |
| 最近记录: |