从字典中存在的列表值中获取单个 "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
我正在尝试根据字典的值构建一个集合。每个字典值都是一个字符串列表。
{'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