Python 基于相似特定值的合并字典

Python 基于相似特定值的合并字典,python,list,dictionary,merge,Python,List,Dictionary,Merge,我正在尝试根据它们相似的特定值合并字典。目前我有这本字典: [{'max_score': '110', 'total_mark': '75', 'id': 1}, {'max_score': '110', 'total_mark': '75', 'id': 2}, {'max_score': '131', 'total_mark': '99', 'id': 1}, {'max_score': '131', 'total_mark': '64', 'id':

我正在尝试根据它们相似的特定值合并字典。目前我有这本字典:

    [{'max_score': '110', 'total_mark': '75', 'id': 1},
     {'max_score': '110', 'total_mark': '75', 'id': 2},
     {'max_score': '131', 'total_mark': '99', 'id': 1}, 
     {'max_score': '131', 'total_mark': '64', 'id': 2}]
我正试图将它们合并为:

    ['id': '1',
     'rec':[
             {'max_score': '110', 'total_mark': '75'},
             {'max_score': '131', 'total_mark': '99'}
           ],

     'id': '2',
     'rec':[
            {'max_score': '110', 'total_mark': '75'}, 
            {'max_score': '131', 'total_mark': '64'}
           ]
    ]

请帮忙。提前感谢。

您可以使用一个简单的forloop来完成

x = [{'max_score': '110', 'total_mark': '75', 'id': 1},
     {'max_score': '110', 'total_mark': '75', 'id': 2},
     {'max_score': '131', 'total_mark': '99', 'id': 1}, 
     {'max_score': '131', 'total_mark': '64', 'id': 2}]

d = {}
for i in x:
    if i["id"] not in d:
        d[i["id"]] = {'rec': [{'max_score': i['max_score'], 'total_mark': i['total_mark']}]}
    else:
        d[i["id"]]['rec'].append({'max_score': i['max_score'], 'total_mark': i['total_mark']})

print d
输出

{1: {'rec': [{'total_mark': '75', 'max_score': '110'}, {'total_mark': '99', 'max_score': '131'}]}, 2: {'rec': [{'total_mark': '75', 'max_score': '110'}, {'total_mark': '64', 'max_score': '131'}]}}

定义“相似”可能重复。@javed您预期的o/p是错误的,因为列表不能有
id:1
相似的值。此外,如果您将其设置为
dict
,则问题是
id
rec
是重复的键。我已更新了我的o/p,很抱歉错误的一个。“相似”是指我想根据相似的“id”合并dict,这就是相似在这里的定义。你为什么不改进你的“保留”问题?相反,你又问了一些几乎相似的问题只是想知道你是否接受我的答案。我发现(ab)使用SO作为迭代的“CodeRefiner”令人讨厌。
对于x中的I:d.setdefault(I[“id”],[])。追加({'max_score':I['max_score'],'total_mark':I['total_mark']})
以摆脱
如果:。。。其他:…
您能帮我重复一下这个记录吗?输出是我期望的,但我没有任何方法检索数据。请帮助我获取的“rec”keys@javed; 同样,您可以使用循环来获取“rec”列表。d中的i示例:打印d[i][“rec”]谢谢您的帮助。我对python非常陌生。我真的很感谢你的帮助。
    dict_data = {}
    for  val in data:
        score, mark, id_ = val
        if val[id_] in dict_data:
            dict_data[val[id_]]['rec'].append({"max_score":val[score],"total_mark":val[mark]})
        else:
            dict_data.setdefault(val[id_],{'rec':[{"max_score":val[score],"total_mark":val[mark]}]})
>>>{1: {'rec': [{'max_score': '75', 'total_mark': '110'},
                {'max_score': '99', 'total_mark': '131'}]},
   2: {'rec': [{'max_score': '75', 'total_mark': '110'},
               {'max_score': '64', 'total_mark': '131'}]}}