【问题标题】:merging dictionary based on their similar specific values根据相似的特定值合并字典
【发布时间】:2018-02-12 07:26:11
【问题描述】:

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

    [{'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'}
           ]
    ]

请帮忙。提前致谢。

【问题讨论】:

  • 定义“相似”。
  • @javed 您预期的 o/p 错误,因为列表不能有 id:1 类似的值。此外,如果您将其设为 dict,则问题是 idrec 是重复键。
  • 我已经更新了我的 o/p 对不起不正确的。和“相似”的意思是我想根据相似的“id”合并字典,所以这就是相似的定义。
  • 你为什么不细化你的“ON HOLD”问题stackoverflow.com/questions/48719814/… - 相反你又问了一些几乎相似的问题? - 只是想知道 b/c 你接受我对此的回答。我发现(ab)使用 SO 作为迭代的“CodeRefiner”令人讨厌。

标签: python list dictionary merge


【解决方案1】:

你可以用一个简单的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'}]}}

【讨论】:

  • for i in x: d.setdefault(i["id"],[]).append({'max_score': i['max_score'], 'total_mark': i['total_mark']}) 摆脱if: ... else: ...
  • 你能帮我迭代这条记录吗?输出是我所期望的,但我没有任何方法来检索数据。帮我拿到钥匙的“录音”
  • @javed;再次,您可以使用循环来获取“rec”列表。例如在 d 中的 i:打印 d[i]["rec"]
  • 感谢您的帮助。我对python很陌生。非常感谢您的帮助。
【解决方案2】:
    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'}]}}

【讨论】:

    猜你喜欢
    • 2022-09-29
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    相关资源
    最近更新 更多