如何在Python中将字典的键值对收集到一个大字典中?

tha*_*y33 2 python dictionary

我有一本以下格式的字典:

data = {
    'Bob': {
        'age': 12,
        'weight': 150,
        'eye_color': 'blue'
    },
    'Jim': {
        'favorite_food': 'cherries',
        'sport': 'baseball',
        'hobby': 'running'
    },
    'Tom': {
        'strength': 'average',
        'endurance': 'high',
        'heart_rate': 'low'
    }
}
Run Code Online (Sandbox Code Playgroud)

将 dict 中的所有字典连接成一个新字典的最 Pythonic 方法是什么,这样我最终会得到如下所示的结果:

new_dict = {
    'age': 12,
    'weight': 150,
    'eye_color': 'blue',
    'favorite_food': 'cherries',
    'sport': 'baseball',
    'hobby': 'running',
    'strength': 'average',
    'endurance': 'high',
    'heart_rate': 'low'
}
Run Code Online (Sandbox Code Playgroud)

Bro*_*ark 6

您可以使用functools.reduce()一次联合一个字典来构建结果:

from functools import reduce

data = {
 'Bob' : { 'age': 12, 'weight': 150, 'eye_color': 'blue' },
 'Jim' : { 'favorite_food': 'cherries', 'sport': 'baseball', 'hobby': 'running' },
 'Tom' : { 'strength': 'average', 'endurance': 'high', 'hear_rate': 'low' }
}

result = reduce(lambda x, y: dict(**x, **y), data.values(), {})

print(result)
Run Code Online (Sandbox Code Playgroud)

这输出:

{'age': 12, 'weight': 150, 'eye_color': 'blue', 'favorite_food': 'cherries',
'sport': 'baseball', 'hobby': 'running', 'strength': 'average',
'endurance': 'high', 'hear_rate': 'low'}
Run Code Online (Sandbox Code Playgroud)

在 Python 3.9 或更高版本上,如果您使用的是 Python 3.9 或更高版本,则可以使用lambda x: x | yoperator.or_dict.__or__来代替。lambda x: dict(**x, **y)后两者来自疯狂物理学家的建议。