从列表中移除匹配项
抱歉如果这个问题重复了,我搜索过但找不到任何帮助的内容。
我现在正在尝试比较两个列表。如果有任何相同的项目,我会把它们全部从其中一个列表中删除。
不过我得到的结果有点问题。下面是我使用的方法的一个粗略但准确的描述:
>>> 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
来找出 a
和 b
中共同的项目:
for x in set(a).intersection(b):
a.remove(x)
1
你写的 a = i
和 c = a
其实只是给同一个东西起了不同的名字。也就是说,当你从 a
中删除东西时,b
和 i
里的内容也会被删除,因为它们指向的是同一个东西。为了避免这个问题,你应该先把列表复制一份,像这样:
a = i[:]
c = a[:]
2
在Python中,当你写下这个:
i = [1,2,3,4,5,6,7,8,9]
你创建了一个对象(在这个例子中是一个列表),并把它命名为 i。接下来的这一行 a = i
告诉解释器,名字 a
也指向同一个对象。这意味着 a
和 i
实际上是同一个东西。如果你想让它们成为两个独立的对象,你需要复制原来的列表。你可以使用切片的简写方式 i[:]
,或者更明确地使用 a = list(i)
来做到这一点。