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


80

我有一个清单清单:

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

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

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

最简单的方法是什么?

Answers:


144

set.union 做你想要的:

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

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


@sth,例如,谢谢,但是当我运行它时,我得到一个错误:回溯(最近一次调用最近):文件“ so_example.py”,第33行,在吗?results_union = set()。union(* result_lists)TypeError:union()恰好接受一个参数(给定3个)
AJ。

1
@AJ:根据文档(docs.python.org/library/stdtypes.html#set.union),union()仅支持2.6或更高版本的Python的多个参数。你似乎在此之前使用的版本,所以你可能需要使用一个明确的循环:total = set(); for x in results_list: total.update(x) (S /; / \ n /)
某事

2
您还可以通过将第二行更改为results_union = set.union(*(set(el) for el in results_list))
Noel Evans

1
@Jean-FrançoisFabre TypeError: descriptor 'union' requires a 'set' object but received a 'list'(至少在Python 3.6中)。
Paritosh Singh,

1
如果使用set.union(*results_list),则手动绑定方法描述符,即results_list以“ self”的第一个元素形式发送。这带来了一些怪异的限制:1.不能正确地转储类型(现在第一个元素必须是集合或集合子类的实例),并且2.空联合results_list将是一个错误(错误结果-应该返回空组)。
wim

11

既然你似乎是使用Python 2.5(这是很好的提你●如果你需要的版本一个A!= 2.6,目前生产的一个,顺便;-),想一个列表,而不是一组为结果,我建议:

import itertools

...

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

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


+1完美时机的完美范例,让您沉浸在精美的itertools包装中。
gotgenes 2010年

@Alex谢谢...编辑了我的问题以指定版本,并消除了自己在版本中落后的指责:)我将重点研究itertools,感谢您的建议。
AJ。

@AJ,不要怪,毕竟我们都可能在这样的约束下受苦(但请记住,请在以后的Qs中注明!)itertools.chain顺便说一下,在Python 2.4中也可以正常工作。
亚历克斯·马特利

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']    


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 ]

5
您为什么还要“避免需要套子”?为此,它们更快,更清晰。每次执行列表时,“ x in a”都会在列表中进行线性蛮力搜索。uck
彼得·汉森

集需要类型转换,除非您要处理较大的N,否则线性速度也不错

3
“类型转换”?在Python中?从何时起?集基本上是仅包含键的字典,它们使用哈希和相等性比较。在列表上使用“ x in a”也可以进行相等比较。类型转换到底是什么?
彼得·汉森

0

以理解的方式:

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

要么

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.