嗨,让我们说我在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'
。
这种行为的原因是我提到过的吗?或者我做错了什么?
答案 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)