我想使用公用键“ Pontos”合并多个词典的列表:
all_dicts = [{'Pontos': {'70': {0: {'atleta_id': 92981, 'apelido': 'Ronaldo'},
1: {'atleta_id': 107677, 'apelido': 'Juninho'},
2: {'atleta_id': 71937, 'apelido': 'Juninho'}
}
}
},
{'Pontos': {'75': {0: {'atleta_id': 85425, 'apelido': 'João Paulo'},
1: {'atleta_id': 71937, 'apelido': 'Juninho'},
2: {'atleta_id': 105998, 'apelido': 'Vinícius'}
}
}
},...]
最后得到:
{'Pontos': {'70': {0: {'atleta_id': 92981, 'apelido': 'Ronaldo'},
1: {'atleta_id': 107677, 'apelido': 'Juninho'},
2: {'atleta_id': 71937, 'apelido': 'Juninho'}
}
},
{'75': {0: {'atleta_id': 85425, 'apelido': 'João Paulo'},
1: {'atleta_id': 71937, 'apelido': 'Juninho'},
2: {'atleta_id': 105998, 'apelido': 'Vinícius'}
}
}, ...
}
我该怎么做?
答案 0 :(得分:0)
from copy import deepcopy
def dict_of_dicts_merge(x, y):
z = {}
overlapping_keys = x.keys() & y.keys()
for key in overlapping_keys:
z[key] = dict_of_dicts_merge(x[key], y[key])
for key in x.keys() - overlapping_keys:
z[key] = deepcopy(x[key])
for key in y.keys() - overlapping_keys:
z[key] = deepcopy(y[key])
return z
result = {}
for dict_elem in all_dicts:
dict_of_dicts_merge(result, dict_elem)
return result
答案 1 :(得分:0)
尝试一下
d={}
for k in all_dicts[0].keys():
d[k]=tuple(d[k] for d in all_dicts)
答案 2 :(得分:0)
使用列表理解和更新
def merge_dicts(lst_dicts, keyword):
# List comprehension to get list of dicts with keyword
lst = [d[keyword] for d in lst_dicts if d.get(keyword)]
# Use update to place into one dictionary
result = {keyword:{}}
for d in lst:
result[keyword].update(d)
return result
用法
result = merge_dicts(all_dicts, 'Pontos')
示例
all_dicts = [{'Pontos': {'70': {0: {'atleta_id': 92981, 'apelido': 'Ronaldo'},
1: {'atleta_id': 107677, 'apelido': 'Juninho'},
2: {'atleta_id': 71937, 'apelido': 'Juninho'}
}
}
},
{'Pontos': {'75': {0: {'atleta_id': 85425, 'apelido': 'João Paulo'},
1: {'atleta_id': 71937, 'apelido': 'Juninho'},
2: {'atleta_id': 105998, 'apelido': 'Vinícius'}
}
}
},
{'Other': {'72': {0: {'atleta_id': 12981, 'apelido': 'Ronaldo'},
1: {'atleta_id': 207677, 'apelido': 'Juninho'},
2: {'atleta_id': 31937, 'apelido': 'Juninho'}
}
}
}]
结果
{'Pontos': {'70': {0: {'atleta_id': 92981, 'apelido': 'Ronaldo'},
1: {'atleta_id': 107677, 'apelido': 'Juninho'},
2: {'atleta_id': 71937, 'apelido': 'Juninho'}},
'75': {0: {'atleta_id': 85425, 'apelido': 'João Paulo'},
1: {'atleta_id': 71937, 'apelido': 'Juninho'},
2: {'atleta_id': 105998, 'apelido': 'Vinícius'}}}}