我有一个列表列表,我想构建一个存在于所有子列表中的元素集.
例子: 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)
问题是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)
其他人已经发布了其他选项,每个选项都有助于您思考它们的工作方式.