use*_*339 20 python dictionary
所以我的目标是从:
fruitColourMapping = [{'apple': 'red'}, {'banana': 'yellow'}]
Run Code Online (Sandbox Code Playgroud)
至
finalMap = {'apple': 'red', 'banana': 'yellow'}
Run Code Online (Sandbox Code Playgroud)
我得到的方法是:
from itertools import chain
fruits = list(chain.from_iterable([d.keys() for d in fruitColourMapping]))
colour = list(chain.from_iterable([d.values() for d in fruitColourMapping]))
return dict(zip(fruits, colour))
Run Code Online (Sandbox Code Playgroud)
还有更好的pythonic方式吗?
Pav*_*sov 28
{k: v for d in fruitColourMapping for k, v in d.items()}
Run Code Online (Sandbox Code Playgroud)
nne*_*neo 26
finalMap = {}
for d in fruitColourMapping:
finalMap.update(d)
Run Code Online (Sandbox Code Playgroud)
Ada*_*dam 26
在Python 3中,您可以使用新的ChainMap:
ChainMap将多个dicts(或其他映射)组合在一起以创建单个可更新视图.
底层映射存储在列表中.该列表是公共的,可以使用maps属性访问或更新.没有其他州.查找会连续搜索基础映射,直到找到密钥.相反,写入,更新和删除仅对第一个映射进行操作.
您只需要这样做(更改名称以遵守Python命名约定):
from collections import ChainMap
fruit_colour_mapping = [{'apple': 'red'}, {'banana': 'yellow'}]
final_map = ChainMap(*fruit_colour_mapping)
Run Code Online (Sandbox Code Playgroud)
然后你可以使用所有正常的映射操作:
# print key value pairs:
for element in final_map.items():
print(element)
# change a value:
final_map['banana'] = 'green' # supermarkets these days....
# access by key:
print(final_map['banana'])
Run Code Online (Sandbox Code Playgroud)
Sil*_*Ray 13
而不是解构和重建,只需复制和更新:
final_map = {}
for fruit_color_definition in fruit_color_mapping:
final_map.update(fruit_color_definition)
Run Code Online (Sandbox Code Playgroud)
使用reduce将每个字典应用到一个空的初始值设定项。由于dict.update总是返回None,因此使用d.update(src) or d给出reduce所需的返回值。
final_dict = reduce(lambda d, src: d.update(src) or d, dicts, {})
Run Code Online (Sandbox Code Playgroud)
>>> dicts = [{'a': 1, 'b': 2}, {'b': 3, 'c': 4}, {'a': 6}]
>>> final_dict = reduce(lambda d, src: d.update(src) or d, dicts, {})
>>> final_dict
{'a': 6, 'c': 4, 'b': 3}
Run Code Online (Sandbox Code Playgroud)
给定
d1, d2 = [{'apple': 'red'}, {'banana': 'yellow'}]
Run Code Online (Sandbox Code Playgroud)
代码
在 Python 3.5 中,引入了字典解包(参见PEP 448):
{**d1, **d2}
# {'apple': 'red', 'banana': 'yellow'}
Run Code Online (Sandbox Code Playgroud)
在Python 3.9中,引入了合并运算符:
d1 | d2
# {'apple': 'red', 'banana': 'yellow'}
Run Code Online (Sandbox Code Playgroud)
我想出了一个有趣的衬里。
>>> a = [{"wow": 1}, {"ok": 2}, {"yeah": 3}, {"ok": [1,2,3], "yeah": True}]
>>> a = dict(sum(map(list, map(dict.items, a)), []))
>>> a
{'wow': 1, 'ok': [1, 2, 3], 'yeah': True}
Run Code Online (Sandbox Code Playgroud)