创建包含在多个列表中的所有值的并集的Pythonic方法

创建包含在多个列表中的所有值的并集的Pythonic方法,python,list,set-union,Python,List,Set Union,我有一份清单: lists = [[1,4,3,2,4], [4,5]] 我想将此列表展平并删除所有重复项;或者,换句话说,应用集合并集操作: desired_result = [1, 2, 3, 4, 5] 最简单的方法是什么 按顺序排列的列表不支持并集,但集合支持并集。退房。做你想做的事: >>> results_list = [[1,2,3], [1,2,4]] >>> results_union = set().union(*results_lis

我有一份清单:

lists = [[1,4,3,2,4], [4,5]]
我想将此列表展平并删除所有重复项;或者,换句话说,应用集合并集操作:

desired_result = [1, 2, 3, 4, 5]

最简单的方法是什么

按顺序排列的列表不支持并集,但集合支持并集。退房。

做你想做的事:

>>> results_list = [[1,2,3], [1,2,4]]
>>> results_union = set().union(*results_list)
>>> print(results_union)
set([1, 2, 3, 4])

您也可以使用两个以上的列表来执行此操作。

我使用以下方法来执行交叉,从而避免了对集合的需要

a, b= [[1,2,3], [1,2]]
s = filter( lambda x: x in b, a)
或者


由于您似乎正在使用Python 2.5(如果您需要版本A!=2.6,顺便说一句,当前的生产版本;-),并且想要一个列表而不是一个集合,那么在Q中提到它将是很好的,我建议:

import itertools

...

return list(set(itertools.chain(*result_list)))

通常是使用迭代器(以及许多类型的序列或集合)的一种很好的方法,我衷心建议您熟悉它<代码>itertools.chain,尤其是有文档记录。

您也可以遵循这种风格

In [12]: a = ['Orange and Banana', 'Orange Banana']
In [13]: b = ['Grapes', 'Orange Banana']
In [14]: c = ['Foobanana', 'Orange and Banana']

In [20]: list(set(a) | set(b) | set(c))
Out[20]: ['Orange and Banana', 'Foobanana', 'Orange Banana', 'Grapes']

In [21]: list(set(a) & set(b) | set(c))
Out[21]: ['Orange and Banana', 'Foobanana', 'Orange Banana']    
以理解的方式:

[*{j代表i中j的列表中的i}]

[*functools.reduce(lambda x,y:{*x,*y},list)]

@sth,例如,谢谢,但当我运行它时,我得到一个错误:回溯(最近一次调用):文件“so_example.py”,第33行,在?results\u union=set().union(*result\u list)TypeError:union()只接受一个参数(给定3个)@AJ:根据文档,对于Python版本2.6或更高版本,union()只支持多个参数。您似乎使用了之前的版本,因此可能必须使用显式循环:
total=set();对于结果列表中的x:total.update(x)
(s/;/\n/)您还可以通过将第二行更改为
结果联合=集.union(*(结果列表中的el设置(el))来保存创建空集的操作
@Jean-Françoisfare
类型错误:描述符“union”需要一个“set”对象,但至少在python 3.6中收到一个“list”
。如果使用
set.union(*results\u list)
则手动绑定方法描述符,即将
results\u list的第一个元素作为“self”发送。这就产生了一些奇怪的限制:1。没有正确的duck类型(现在第一个元素必须是set或set子类的实例),以及2。合并一个空的
结果\u列表将是一个错误(不正确的结果-应返回空集合)。您为什么还要“避免集合的需要”?出于这个目的,它们更快、更清晰。每次执行时,你的“a中的x”都会对列表进行线性的强力搜索。糟糕。场景需要类型转换,线性速度也不错,除非你处理的是一个大的N“类型转换”?用Python?从什么时候开始?集合基本上是只有键的dict,它们使用散列和相等比较。在列表中使用“a中的x”也可以进行相等比较。关于类型转换的所有这些都是什么?+1是一个很好的例子,说明了一个很好的时间来研究奇妙的
itertools
软件包。@Alex谢谢…编辑了我的问题以指定版本,并消除了我在版本中如此落后的责任:)我会重点研究itertools,感谢你的建议。@AJ,没有责任,毕竟,我们都会受到这样的限制(但请记住在未来的Qs中详细说明!)<代码>itertools.chain
在Python2.4中也可以很好地工作。谢谢,这对于查看用于复杂理解的简明模式非常有帮助。我一直在寻找这样的例子。
In [12]: a = ['Orange and Banana', 'Orange Banana']
In [13]: b = ['Grapes', 'Orange Banana']
In [14]: c = ['Foobanana', 'Orange and Banana']

In [20]: list(set(a) | set(b) | set(c))
Out[20]: ['Orange and Banana', 'Foobanana', 'Orange Banana', 'Grapes']

In [21]: list(set(a) & set(b) | set(c))
Out[21]: ['Orange and Banana', 'Foobanana', 'Orange Banana']    
desired_result = [x for y in lists for x in y]