繁体   English   中英

删除列表中的匹配项

[英]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 = ic = a仅使引用相同对象的新名称成为可能。 然后,当您从a删除对象时,它们也会从bi删除,因为它们是同一对象。 您将需要复制列表,就像这样

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM