106

我有一个列表列表:

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

我想展平此列表并删除所有重复项;或者,换句话说,应用集合联合操作:

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

最简单的方法是什么?

4

7 回答 7

181

set.union做你想做的事:

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

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

于 2010-01-28T00:54:10.940 回答
18

由于您似乎使用的是 Python 2.5(如果您需要版本的 A != 2.6,顺便说一下,当前的生产版本,最好在 Q 中提及;-)并且想要一个列表而不是一个集合作为结果,我建议:

import itertools

...

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

itertools通常是使用迭代器(以及多种序列或集合)的好方法,我衷心建议您熟悉它。 itertools.chain,特别是在此处记录。

于 2010-01-28T03:38:01.517 回答
3

你也可以按照这种风格

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']    
于 2016-03-01T12:13:48.520 回答
1

列表不支持联合,列表是有序的,但集合支持。查看set.union

于 2010-01-28T00:53:35.777 回答
1

以理解的方式:

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

或者

[*functools.reduce(lambda x,y: {*x, *y}, lists)]
于 2020-06-21T07:02:58.253 回答
0

我使用以下来做交叉点,这避免了对集合的需要。

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 ]
于 2010-01-28T00:58:16.210 回答
-2
desired_result = [x for y in lists for x in y]
于 2019-08-03T09:41:04.893 回答