从python

时间:2017-05-17 20:06:14

标签: python python-2.7 list

嗨,让我们说我在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'

这种行为的原因是我提到过的吗?或者我做错了什么?

6 个答案:

答案 0 :(得分:9)

只需轻微更改您的代码,即可浏览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]

答案 1 :(得分:6)

您还可以使用set个对象的差异。

a = list(set(y) - set(x))
b = list(set(x) - set(y))

答案 2 :(得分: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

应该做的伎俩?它的内存效率要低一点。

答案 3 :(得分: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))

答案 4 :(得分: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)))

答案 5 :(得分:-1)

您可以使用set方法删除列表中的元素。

s1=input()
s2=input()
str=list(set(s1).symmetric_difference(set(s2)))
print(str)