从字典中获取值到集合中的最有效方法
Most efficient way to get values from a dictionary into a set
我似乎无法弄清楚如何使用集合理解将以下内容写成一行代码。如果不可能,是否有更快的方法来做我在这里想做的事情?基本上只是将字典的所有值放入一个集合中。一些值可以是空集。下面是一个简单的例子
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}
最简单的可能是:
>>> 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}
作为 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}
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}
我似乎无法弄清楚如何使用集合理解将以下内容写成一行代码。如果不可能,是否有更快的方法来做我在这里想做的事情?基本上只是将字典的所有值放入一个集合中。一些值可以是空集。下面是一个简单的例子
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}
最简单的可能是:
>>> 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}
作为 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}
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}