2

我似乎无法弄清楚如何使用集合理解将以下内容写入一行代码。如果不可能,有没有更快的方法来做我想做的事情?基本上只是将字典的所有值放入一个集合中。一些值可以是一个空集。下面是一个简单的例子

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}
4

3 回答 3

7

最简单的可能是:

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

无需对值中的空集进行特殊处理。将一个空集折叠到联合中对结果没有影响,并且在 Python 代码中提前检查长度比让计算set.union()出来要慢。

有一定的理解力

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

>>> {x for oneset in d.values() for x in oneset}
{1, 2, 3, 4}
于 2018-01-05T17:29:09.797 回答
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}
于 2018-01-05T17:32:03.703 回答
1

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

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}
于 2018-01-05T17:45:35.407 回答