【发布时间】:2010-01-28 00:44:41
【问题描述】:
我有一个列表列表:
lists = [[1,4,3,2,4], [4,5]]
我想展平此列表并删除所有重复项;或者,换句话说,应用集合联合操作:
desired_result = [1, 2, 3, 4, 5]
最简单的方法是什么?
【问题讨论】:
我有一个列表列表:
lists = [[1,4,3,2,4], [4,5]]
我想展平此列表并删除所有重复项;或者,换句话说,应用集合联合操作:
desired_result = [1, 2, 3, 4, 5]
最简单的方法是什么?
【问题讨论】:
set.union 做你想做的事:
>>> results_list = [[1,2,3], [1,2,4]]
>>> results_union = set().union(*results_list)
>>> print(results_union)
set([1, 2, 3, 4])
您也可以对两个以上的列表进行此操作。
【讨论】:
union() 仅支持 Python 2.6 或更高版本的多个参数。您似乎使用了之前的版本,因此您可能必须使用显式循环:total = set(); for x in results_list: total.update(x) (s/;/\n/)
results_union = set.union(*(set(el) for el in results_list))来保存创建一个空集
TypeError: descriptor 'union' requires a 'set' object but received a 'list' 至少在 python 3.6 中。
set.union(*results_list),您将手动绑定方法描述符,即将results_list 的第一个元素作为“self”发送。这产生了一些奇怪的限制:1. 没有正确地进行鸭式类型(现在第一个元素必须是集合子类的集合或实例),以及 2. 空 results_list 的联合将是一个错误(不正确的结果 -应该返回空集)。
理解方式:
[*{ j for i in lists for j in i }]
或
[*functools.reduce(lambda x,y: {*x, *y}, lists)]
【讨论】:
【讨论】:
itertools 软件包的好时机。
itertools.chain 在 Python 2.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']
【讨论】:
列表不支持联合,列表是有序的,但集合支持。查看set.union。
【讨论】:
desired_result = [x for y in lists for x in y]
【讨论】:
我用下面的做交叉点,这样就避免了集合的需要。
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 ]
【讨论】: