Python 获取列表之间的差异,保留非唯一值
我想知道两个列表之间的区别 我正在寻找一个解决方案,就像我只想考虑非唯一的列表值。Python 获取列表之间的差异,保留非唯一值,python,list,python-3.x,difference,Python,List,Python 3.x,Difference,我想知道两个列表之间的区别 我正在寻找一个解决方案,就像我只想考虑非唯一的列表值。 x = [1, 1, 2, 2, 3] y = [1, 2] # i want z = x - y # z = [1, 2, 3] “我的代码”上面的解决方案将两个列表转换为一组,允许-操作符处理它们,但会从列表中删除非唯一值。你能想出一个简单的“一行”解决方案来满足我的需求吗?你刚才描述了两个集合的并集,所以使用set: >>> list(set(x).union(set(y))) [1,
x = [1, 1, 2, 2, 3]
y = [1, 2]
# i want
z = x - y
# z = [1, 2, 3]
“我的代码”上面的解决方案将两个列表转换为一组,允许
-
操作符处理它们,但会从列表中删除非唯一值。你能想出一个简单的“一行”解决方案来满足我的需求吗?你刚才描述了两个集合的并集,所以使用set
:
>>> list(set(x).union(set(y)))
[1, 2, 3]
您可以使用
collections.Counter
查找每个列表中的元素计数。然后,您可以获取差异并根据结果重建一个列表
>>> from collections import Counter
>>> x = [1, 1, 2, 2, 3]
>>> y = [1, 2]
>>> [k for _ in range(v) for k,v in (Counter(x) - Counter(y)).iteritems()]
[1, 2, 3]
缺点是,结果的顺序与输入列表的顺序没有真正的相关性。上面显示的结果看起来是排序的,这一事实依赖于实现,可能只是巧合。可能不是想象,首先想到的是
x=[1,1,2,2,3]
y=[1,2]
_ = [ x.remove(n) for n in y if n in x ]
x
[1,2,3]
以下是我的看法:
x = [1, 1, 2, 2, 3]
y = [1, 2]
z = [n for n in y if (n in x) and x.remove(n)] + x
print(z) # -> [1, 2, 3]
x = [1, 1, 1, 2]
y = [1]
z = [n for n in y if (n in x) and x.remove(n)] + x
print(z) # -> [1, 1, 2]
我认为他想要的是差异,而不是联盟。那么x=[1,2,2]和y=[1]应该有[2,2]的结果。那么
a=[1,4]
和b=[5]
呢a-b=[1,4,5]
?不能保证维持秩序。我可能读错了,但据我理解,x-y
给出了并集的倒数,他想得到并集的倒数。需要更多信息。x=[1,1,1,2],y=[1]的期望输出是什么?x=[1],y=[2]的期望输出是什么?如上所述,我只是想返回差异,或者x-y的剩余部分,我不太担心x或y之后“我不太担心x或y之后。”我不明白。我没有说要保留列表的原始内容。请回答我的问题。是否要保留结果中列表x
中值的顺序?x=[1,1,2],y=[1]
=[1,1,2]
,只删除1
,对于x=[1],y=[2]
=[1]
,2
不会被删除,因为它不在x
列表中。代码中不会出现这种情况,因为y
始终包含x
元素。维护秩序并不重要。仅仅因为副作用而理解列表(为了创建“一行”)被许多人认为是浪费,基本上是一种糟糕的做法。@martineu,你能解释一下你的评论吗?对于好奇心和学习,什么是“列表理解”?