我有一个字典,其值为set类型,如下所示:
d = collections.defaultdict(set)
我希望创建一个包含存储在字典集中的每个值的单个集合,例如
d[1] = {'foo', 'bar'}
d[2] = {'bar', 'baz'}
应该给:
{'foo', 'bar', 'baz'}
我尝试了以下但是它没有工作:
set([v for v in st for st in d.values()])
相反,我得到:NameError: name 'st' is not defined
答案 0 :(得分:2)
你的list comprehension是错误的,你需要:
set([v for st in d.values() for v in st])
另请注意,您可以使用generator expression代替更符合内存的内容:
set(v for st in d.values() for v in st)
这相当于:
s = set()
for st in d.values():
for v in st:
s.add(v)
答案 1 :(得分:2)
这只是价值的结合
set.union(*d.values())
例如:
>>> d = collections.defaultdict(set)
>>> d[1] = {'foo', 'bar'}
>>> d[2] = {'bar', 'baz'}
>>> set.union(*d.values())
{'baz', 'foo', 'bar'}
如果d
是一个非常大的字典,对于奖励积分,您可能希望避免解包(*)值。
>>> from functools import reduce
>>> reduce(lambda x, y: x.union(y), d.values(), set())
{'baz', 'foo', 'bar'}
答案 2 :(得分:0)
您可以使用@gnibbler建议的reduce操作。如果您仍想使用for
,那么您可以通过删除一个嵌套来避免对union
的过多调用。
s = set()
for st in d.values():
s = s.union(st)
但是,这个循环是以每次创建新集合为代价的。因此,这取决于你的词典内容。