从词典中获取值到集合的最有效方法

时间:2018-01-05 17:22:43

标签: python dictionary set set-comprehension

我似乎无法弄清楚如何使用set comprehension将以下内容编写成一行代码。如果它不可能有更快的方式来做我想在这里做的事情?基本上只是将字典的所有值都集成到一个集合中。某些值可以是空集。一个简单的例子如下

d = {1:set(),2:{1,2,3},3:{4}}

t = set()

for k, v in d.items():
   if len(v) > 0:
      t.update(v)

print(t)

输出

{1,2,3,4}

3 个答案:

答案 0 :(得分:7)

最简单的可能是:

>>> set.union(*d.values())
{1, 2, 3, 4}

在值中不需要特殊情况下的空集。将空集折叠到联合中对结果没有任何影响,并且在Python代码中提前检查长度比让set.union()弄清楚它更慢。

具有SET综合

你也可以通过集合理解来做到这一点,但我希望这种方式会慢得多(尽管我还没有计时):

>>> {x for oneset in d.values() for x in oneset}
{1, 2, 3, 4}

答案 1 :(得分:3)

作为union内容的替代方案,您可以使用chain.from_iterable

from itertools import chain

d = {1:set(),2:{1,2,3},3:{4}}
set(chain.from_iterable(d.values()))
>>> {1, 2, 3, 4}

答案 2 :(得分:1)

Tim Peters和jdehesa的答案都比使用集合理解更快,因为它们避免了以Python速度运行的显式双for循环。但是这里是如何通过集合理解来实现的:

d = {1:set(), 2:{1,2,3}, 3:{4}}
t = {v for u in d.values() for v in u}
print(t)

<强>输出

{1, 2, 3, 4}