Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取列表之间的差异,保留非唯一值_Python_List_Python 3.x_Difference - Fatal编程技术网

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,你能解释一下你的评论吗?对于好奇心和学习,什么是“列表理解”?