【问题标题】:Most efficient way to get values from a dictionary into a set将值从字典中获取到集合中的最有效方法
【发布时间】:2023-04-01 16:09:01
【问题描述】:

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

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}

【问题讨论】:

  • 我看不到这里...
  • 对不起,忘了把 t 放在那里。请看更新。它基本上只是一个集合
  • 为什么不直接t = set.union(*d.values())
  • for v in d.values() 可以,if len(v) > 0 不是必须的。
  • 我之前确实尝试过 set.union 但没有得到答案。显然我错过了其中的*。谢谢

标签: python dictionary set set-comprehension


【解决方案1】:

最简单的可能是:

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

【讨论】:

  • 正如我上面提到的,我之前确实尝试过 set.union 但没有得到答案。显然我错过了其中的 * 这就是它不起作用的原因。谢谢。 * 做了什么没有它就行不通?
  • @user1179317 见Unpacking Argument Lists
【解决方案2】:

作为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}

【讨论】:

    【解决方案3】:

    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}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 2010-11-18
      • 2016-09-25
      • 2021-08-01
      相关资源
      最近更新 更多