在集合字典中获取唯一值

时间:2014-05-04 11:32:08

标签: python python-3.x

我有一个字典,其值为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

3 个答案:

答案 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)

但是,这个循环是以每次创建新集合为代价的。因此,这取决于你的词典内容。