代码之家  ›  专栏  ›  技术社区  ›  user1179317

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

  •  2
  • user1179317  · 技术社区  · 7 年前

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

    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 回复  |  直到 7 年前
        1
  •  7
  •   Tim Peters    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}
    
        2
  •  3
  •   javidcf    7 年前

    作为 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
  •  1
  •   PM 2Ring    7 年前

    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}