从字典中存在的列表值中获取单个 "set" 对象

Get single "set" object from the list values present in the dictionary

我正在尝试根据字典的值构建一个集合。每个字典值都是一个字符串列表。

{'a': ['a','b','c'],'b':['a','b','d'],...}

我正在尝试使用 .update(x) 连接包含字典值的集合。我已经成功地使用了标准的 for 循环:

ingredientSet = set()
for values in recipes.values():
    ingredientSet.update(values)

如果可能的话,我想做的是在集合理解中做到这一点。到目前为止我有这个:

ingredientSet = { ingredientSet.update(x) for x in recipes.values() }

但我的 IDE 给我一个错误,即 "ingredientSet" 在赋值之前被引用。

是否可以在理解中使用 .update(x),或者是否有其他方法可以将项目连接到理解中的集合中?

如果你想要一个理解,你可以用两个 for 来做到这一点,比如:

代码:

values_set = {item for items in data.values() for item in items}

测试代码:

data = {'a': ['a','b','c'],'b':['a','b','d']}

values_set = {item for items in data.values() for item in items}
print(values_set)

结果:

{'d', 'b', 'c', 'a'}

这是使用 itertools.chain.from_iterable(...) 实现此目的的实用方法:

>>> from itertools import chain
>>> my_dict = {'a': ['a','b','c'],'b':['a','b','d']}

>>> set(chain.from_iterable(my_dict.values()))
{'a', 'b', 'c', 'd'}

此外,在此处添加 jonsharpe 的 来自使用 set().union(...) 的评论的回答:

>>> set().union(*my_dict.values())
{'a', 'b', 'd', 'c'}

性能比较

以下是 timeit Python3 上所有答案的比较:

  • 使用 itertools.chain.from_iterable - 每个循环 0.558 微秒

    mquadri$ python3 -m timeit -s "from itertools import chain; my_dict = {'a': ['a','b','c'],'b':['a','b','d']}" "set(chain.from_iterable(my_dict.values()))"
    1000000 loops, best of 3: 0.558 usec per loop
    
  • 使用设置理解 - 每个循环 0.585 usec

    mquadri$ python3 -m timeit -s "from itertools import chain; my_dict = {'a': ['a','b','c'],'b':['a','b','d']}" "{item for items in my_dict.values() for item in items}"
    1000000 loops, best of 3: 0.585 usec per loop
    
  • 使用 set().union(...) - 每个循环 0.614 微秒

    mquadri$ python3 -m timeit -s "from itertools import chain; my_dict = {'a': ['a','b','c'],'b':['a','b','d']}" "set().union(*my_dict.values())"
    1000000 loops, best of 3: 0.614 usec per loop