2

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

{'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)在理解中使用,或者是否有另一种方法可以将项目连接到理解中的集合中?

4

2 回答 2

4

这是使用以下方法实现此目的的实用方法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 的amswer 使用set().union(...)

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

性能比较

下面是timeitPython3 上所有答案的对比:

  • 使用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 微秒

    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
    
于 2018-06-03T21:06:05.980 回答
3

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

代码:

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'}
于 2018-06-03T20:42:23.310 回答