很抱歉,如果这是一个重复的问题,我搜索了一下,找不到任何帮助。
我目前正在尝试比较两个列表。如果有任何匹配的项目,我将从其中一个列表中删除它们。
然而,我的结果是错误的。以下是我使用的方法的粗略但准确的表示:
>>> 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会跳过中间项目(非常烦人)。结果我制作了第三个列表作为可以循环的中间件。
令我感到困惑的是,即使我没有直接要求,这份名单似乎也有所改变!
答案 0 :(得分:1)
最简单的方法是使用set
确定a
和 b
中的共享项目:
for x in set(a).intersection(b):
a.remove(x)
答案 1 :(得分:1)
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))
答案 2 :(得分:1)
您的语句a = i
和c = a
仅创建引用同一对象的新名称。然后,当您从a
移除内容时,它已从b
和i
移除,因为它们是同一个对象。你会想要制作列表的副本,就像这样
a = i[:]
c = a[:]
答案 3 :(得分:1)
在python中,当你写这个:
i = [1,2,3,4,5,6,7,8,9]
您创建一个Object(在本例中为一个列表),并将其分配给名称 i
。您的下一行a = i
告诉解释器名称 a
引用相同的对象。如果您希望它们是单独的对象,则需要复制原始列表。您可以通过切片速记i[:]
来实现,或者您可以使用a = list(i)
更加明确。