创建包含在多个列表中的所有值的联合的 Python 方法

我有一份名单:

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

我想展开这个列表并删除所有重复项; 或者,换句话说,应用一个 set union 操作:

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

最简单的方法是什么?

62123 次浏览

Unions are not supported by lists, which are ordered, but are supported by sets. Check out SetUnion.

set.union 做你想做的:

>>> 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)

或者,

s = [ x for x in b if x in a ]

因为您似乎正在使用 Python 2.5(如果您需要在版本中使用 A,那么在您的 Q 中提到 would是非常好的!= 2.6,顺便说一下,目前的产品之一; ——)并且想要一个列表而不是一个集作为结果,我建议:

import itertools


...


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

Itertools 通常是使用迭代器(以及许多类型的序列或集合)的一种很好的方法,我衷心地建议您熟悉它。特别是 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']
desired_result = [x for y in lists for x in y]

在理解方面:

[*{ j for i in lists for j in i }]

或者

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