删除列表中的匹配项

时间:2014-04-11 20:00:52

标签: python loops python-3.x

很抱歉,如果这是一个重复的问题,我搜索了一下,找不到任何帮助。

我目前正在尝试比较两个列表。如果有任何匹配的项目,我将从其中一个列表中删除它们。

然而,我的结果是错误的。以下是我使用的方法的粗略但准确的表示:

>>> 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会跳过中间项目(非常烦人)。结果我制作了第三个列表作为可以循环的中间件。

令我感到困惑的是,即使我没有直接要求,这份名单似乎也有所改变!

4 个答案:

答案 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 = ic = a仅创建引用同一对象的新名称。然后,当您从a移除内容时,它已从bi移除,因为它们是同一个对象。你会想要制作列表的副本,就像这样

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)更加明确。