[英]Remove matching items in a list
抱歉,如果这是一个重复的问题,我进行了搜索,但找不到任何帮助。
我目前正在尝试比较两个列表。 如果有任何匹配的项目,我将从列表之一中将其全部删除。
但是我得到的结果是越野车。 这是我使用的方法的粗略但准确的表示:
>>> i = [1,2,3,4,5,6,7,8,9]
>>> a = i
>>> c = a
>>> for b in c:
if b in i:
a.remove(b)
>>> a
[2, 4, 6, 8]
>>> c
[2, 4, 6, 8]
因此,我意识到主要的问题是,当我删除项目时,它会缩短列表,因此Python然后跳过了中间项目(非常烦人)。 结果,我列出了第三个列表,作为可以循环的中间对象。
真正令我感到困惑的是,即使我没有直接要求它,这份名单似乎也在改变!
最简单的方法是使用set
来确定a
和 b
共享项:
for x in set(a).intersection(b):
a.remove(x)
a = i
不复制列表,它只是设置另一个变量, i
指向您的列表a
。 尝试这样的事情:
>>> i = [1, 2, 3, 2, 5, 6]
>>> s = []
>>> for i in t:
if i not in s:
s.append(i)
>>> s
[1, 2, 3, 5, 6]
您还可以使用set
来保证不重复,但不保留顺序 :
list(set(i))
您的语句a = i
和c = a
仅使引用相同对象的新名称成为可能。 然后,当您从a
删除对象时,它们也会从b
和i
删除,因为它们是同一对象。 您将需要复制列表,就像这样
a = i[:]
c = a[:]
在python中,当您编写此代码时:
i = [1,2,3,4,5,6,7,8,9]
您创建一个对象(在本例中为列表),并将其分配给名称 i
。 您的下一行a = i
告诉解释器, 名称 a
指向相同的Object。 如果希望它们是单独的对象,则需要复制原始列表。 您可以通过切片速记i[:]
来做到这一点,也可以使用a = list(i)
使其更明确。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.