从Python的两个列表中删除相同的值

6

你好,假设我在Python中有两个列表,我想要从这两个列表中删除相同的值。一种可能的解决方案是:

x = [1, 2, 3, 4, 5, 6, 7, 8]
y = [43, 3123, 543, 76, 879, 32, 14241, 342, 2, 3, 4]
for i in x:
    if i in y:
        x.remove(i)
        y.remove(i)

看起来是正确的,但实际上并不是。我猜原因是在从列表中删除项时,索引会继续迭代。因此,在两个值接近的常见情况下,我们将错过后面的值(代码将不会迭代它)。

>>> x
[1, 3, 5, 6, 8, 9, 10]
>>> y
[43, 3123, 543, 76, 879, 32, 14241, 342, 3]

所以我们缺少值为'3'

这种行为的原因是我提到的吗?还是我做错了其他事情?


是的,当您在迭代对象时修改它时,这正是您将遇到的问题。 - juanpa.arrivillaga
请看这个问题:在迭代时从列表中删除项目 - GIZ
1
强烈不建议修改正在迭代的值。这会使任何试图理解代码正在做什么的人难以确定循环的流程。在这种情况下,通常建议对列表(或其他可迭代对象)进行单独副本的修改,或者迭代索引以切片到列表中:for i in range(len(x)): print(x[i]) - Aaron
6个回答

10

只需稍微更改您的代码,遍历副本x,即x [:]。您在迭代列表时修改了列表。这就是为什么您会错过值3的原因。

for i in x[:]:
      if i in y:
          x.remove(i)
          y.remove(i)

另一种方法

x,y = [i for i in x if i not in y],[j for j in y if j not in x]

如果任何列表中存在重复值,那么这种方法无效,请尝试:x = [1, 2, 3, 4, 5, 6, 7, 8, 3],你还需要复制 y。 - DSLima90
@DSLima90 我认为根据楼主的要求,如果他想删除所有重复项,这种方法是行不通的。但是在从两个列表中删除后,第一个列表中的元素将变得唯一。所以这不是问题。 - Rahul K P
@Rhaul,是的,你说得对。根据我对提供的代码的理解,我假设OP想要删除所有出现的内容。这是一个有效的答案,但或许值得注意的是,它在这一方面与其他答案有所不同。 - DSLima90
@DSLima90 也许你是对的。不管怎样,我已经更新了另一种方法。 - Rahul K P

8
你也可以使用set对象的差异。
a = list(set(y) - set(x))
b = list(set(x) - set(y))

这样做的缺点是它会删除所有重复的条目并且丢失排序。但通常对于想要这样做的人来说,这不是一个问题。 - Taku

3
z=[i for i in x if i not in y]
w=[i for i in y if i not in x]
x=z
y=w

那应该可以解决问题了吧?不过这种方式会稍微浪费一些内存。

这可以简化为 x, y = [i for i in x if i not in y], [i for i in y if i not in x] - Arya McCarthy

2
如果您使用numpy,那么您所需的就是:
x, y = np.setdiff1d(x, y), np.setdiff1d(y, x)

如果您不想使用NumPy:

x, y = list(set(x).difference(y)), list(set(y).difference(x))

2
我个人认为Python的set数据类型是最好的选择:
你可以这样做:
>>> x = [1, 2, 3, 4, 5, 6, 7, 8]
>>> y = [43, 3123, 543, 76, 879, 32, 14241, 342, 2, 3, 4]
>>> sx = set(x)
>>> sy = set(y)
>>> sx.union(sy)
set([1, 2, 3, 4, 5, 6, 7, 8, 32, 43, 76, 342, 543, 879, 3123, 14241])

或者你可以将其简化为一行代码:

list(set(x).union(set(y)))

-1
你可以使用 set 方法来删除列表中的元素。
s1=input()
s2=input()
str=list(set(s1).symmetric_difference(set(s2)))
print(str)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接