使用空集作为初始值减少

Gra*_*ddy 6 python

我有一个列表列表,我想构建一个存在于所有子列表中的元素集.

例子: a = [[1,2],[2,3]]应该给set([1,2,3])

我试过reduce(lambda x,y:x.update(y),a,set([]))但它引发的AttributeError: 'NoneType'对象没有属性'update'

有人能告诉我如何使用reduce功能吗?

Ray*_*ger 10

按照要求:

>>> a = [[1,2],[2,3]]
>>> reduce(lambda s, elems: s.union(elems), a, set())
set([1, 2, 3])
Run Code Online (Sandbox Code Playgroud)

另一种有趣的方式:

>>> from itertools import chain
>>> set(chain.from_iterable(a))
set([1, 2, 3])
Run Code Online (Sandbox Code Playgroud)

还有一个就是冷静:

>>> set.union(set(), *a)
set([1, 2, 3])
Run Code Online (Sandbox Code Playgroud)


kin*_*all 7

问题是update()在集合上返回None,而不是集合.这是记录和预期的行为.假设您想update()出于某种原因使用,可以按如下方式编写lambda:

 lambda x, y: x.update(y) or x
Run Code Online (Sandbox Code Playgroud)

如果第一个子句是"falsy"(即),则该or子句返回.xNone

但实际上,我认为你想用union()而不是update().它大致相同,并返回结果.

lambda x, y: x.union(y) 
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你可以写set()一个空集,你不需要set([]).所以重写的reduce()将是:

reduce(lambda x, y: x.union(y), a, set())
Run Code Online (Sandbox Code Playgroud)

其他人已经发布了其他选项,每个选项都有助于您思考它们的工作方式.