从列表中移除匹配项

1 投票
4 回答
2570 浏览
提问于 2025-04-18 02:24

抱歉如果这个问题重复了,我搜索过但找不到任何帮助的内容。

我现在正在尝试比较两个列表。如果有任何相同的项目,我会把它们全部从其中一个列表中删除。

不过我得到的结果有点问题。下面是我使用的方法的一个粗略但准确的描述:

>>> 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 个回答

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))
1

最简单的方法是使用一个 set 来找出 ab 中共同的项目:

for x in set(a).intersection(b):
    a.remove(x)
1

你写的 a = ic = a 其实只是给同一个东西起了不同的名字。也就是说,当你从 a 中删除东西时,bi 里的内容也会被删除,因为它们指向的是同一个东西。为了避免这个问题,你应该先把列表复制一份,像这样:

a = i[:]
c = a[:]
2

在Python中,当你写下这个:

i = [1,2,3,4,5,6,7,8,9]

你创建了一个对象(在这个例子中是一个列表),并把它命名为 i。接下来的这一行 a = i 告诉解释器,名字 a 也指向同一个对象。这意味着 ai 实际上是同一个东西。如果你想让它们成为两个独立的对象,你需要复制原来的列表。你可以使用切片的简写方式 i[:],或者更明确地使用 a = list(i) 来做到这一点。

撰写回答