共享共同价值时如何合并字典?

我目前从我的数据库中删除了以下数据(4 个字典列表):


raw_data = [{'budget_id': 1, 'name': 'Maria', 'amount': 980, 'user': '10', 'gift': 'Phone', 'cost': 325}, {'budget_id': 1, 'name': 'Maria', 'amount': 980, 'user': '10', 'gift': 'Flower', 'cost': 195}, {'budget_id': 2, 'name': 'Scott', 'amount': 2100, 'user': '10', 'gift': 'Paris Trip', 'cost': 599}, {'budget_id': 2, 'name': 'Scott', 'amount': 2100, 'user': '10', 'gift': 'Ring', 'cost': 1200}]

我想自动合并共享相同“budget_id”的每个字典,以便最后得到以下内容(2 个字典列表):


final_data = [{'name': ['Maria'], 'cost': [195, 325], 'gift': ['Phone', 'Flower'], 'budget_id': [1], 'user': ['10'], 'amount': [980]}, {{'name': ['Scott'], 'cost': [599, 1200], 'gift': ['Paris Trip', 'Ring'], 'budget_id': [2], 'user': ['10'], 'amount': [2100]}

这个想法是它不应该被硬编码,因为从网站传入的词典数量会逐渐移动并减少加班时间。


到目前为止,我已经找到了一个硬编码的解决方案,可以让我成功地合并第一本和第二本字典:


Merge_Init = {}

for key in (fibud.keys() | sebud.keys()):

    if key in final_data[0]: Merge_Init.setdefault(key, []).append(final_data[0][key])

    if key in final_data[1]: Merge_Init.setdefault(key, []).append(final_data[1][key])

print(Merge_Init)


final_merge = {a:list(set(b)) for a, b in Merge_Init.items()}

print("New Dict without Duplicates:", final_merge)

导致 :


New Dict without Duplicates: {'user': ['10'], 'gift': ['Phone', 'Flower'], 'name': ['Maria'], 'amount': [980], 'budget_id': [1], 'cost': [195, 325]}

注意这一次,赠品的花费稍微倒过来了,应该是[325, 195]。


您能否协助找到一个解决方案来循环遍历每个预算并在它们共享相同的 budget_id 时合并它们,而无需任何硬编码解决方案(如“final_data[0]”)同时保持数据完整性?


慕后森
浏览 171回答 3
3回答

婷婷同学_

您可以像这样使用熊猫:import pandas as pddf = pd.DataFrame([{'budget_id': 1, 'name': 'Maria', 'amount': 980, 'user': '10', 'gift': 'Phone', 'cost': 325}, {'budget_id': 1, 'name': 'Maria', 'amount': 980, 'user': '10', 'gift': 'Flower', 'cost': 195}, {'budget_id': 2, 'name': 'Scott', 'amount': 2100, 'user': '10', 'gift': 'Paris Trip', 'cost': 599}, {'budget_id': 2, 'name': 'Scott', 'amount': 2100, 'user': '10', 'gift': 'Ring', 'cost': 1200}])df = df.groupby('budget_id').agg({'name': set,                                   'amount': set,                                   'cost': set ,                                   'user': set,                                   'gift': set}).reset_index()print(df.to_dict('records'))

MM们

该解决方案不会对数组的任何元素进行硬编码,但是由于您对不同的键有不同的要求,因此需要对这些键进行硬编码才能正确处理它们。在合并后的示例中,您只有 ['Maria'],而如果您有两个成本相同的项目,您肯定会期望成本为 [150, 150],而不是 [150]。final = {} # key is budget_id, and value is the all dictionaries merged for dict in list:   budget_id = dict['budget_id']   if budget_id in final:        # for each key you'll do something like this        dictToModify = final[budget_id]        dictToModify.append(dict['gift'])        # for each key in dictionary, add it to the list        # some will be added always to the list: e.g. cost        # some will be added only once, e.g. name and budget_id   else:       # here you're just putting everything in a list as in your final_data example       final[ budget_id ] = {key:[value] for (key,value) in dict.items()}final_data = list(final.values())如果元素不存在,则此循环将元素添加到最终字典,或者如果已存在具有相同 budget_id 的元素,则合并。循环的最后一步是将其转换为字典列表。

斯蒂芬大帝

这是一个解决方案,raw_data为了更好地演示而进行了扩展:raw_data = [{'budget_id': 1, 'name': 'Maria', 'amount': 980, 'user': '10', 'gift': 'Phone', 'cost': 325}, {'budget_id': 1, 'name': 'Maria', 'amount': 980, 'user': '10', 'gift': 'Flower', 'cost': 195}, {'budget_id': 2, 'name': 'Scott', 'amount': 2100, 'user': '10', 'gift': 'Paris Trip', 'cost': 599}, {'budget_id': 2, 'name': 'Scott', 'amount': 2100, 'user': '10', 'gift': 'Ring', 'cost': 1200}, {'budget_id': 2, 'name': 'Scott', 'amount': 2100, 'user': '10', 'gift': 'Watch', 'cost': 240}]final_data = []for entry in raw_data:    found = False    for ind, final in enumerate(final_data):        # Look if the budget entry already exists        if entry['budget_id'] in final['budget_id']:            found = True            break    if found:        # Merge        # Everything - issue if any entry just happens         # to be the same (like cost)        #for key, value in entry.items():            #if not (entry[key] in final[key]):            #   final_data[ind][key].append(entry[key])        # Alternative - specific entries only        final_data[ind]['gift'].append(entry['gift'])        final_data[ind]['cost'].append(entry['cost'])    else:        # If not yet there - add it as a new item, converting         # all values to lists        final_data.append({x:[y] for x,y in entry.items()})print(final_data)代码循环遍历raw_data循环中的所有字典。对于每个字典,它然后循环遍历所有现有条目以final_data跟踪索引enumerate。使用budget_id它检查是否已经遇到并存储了预算条目。如果是这种情况,它会设置一个适当的标志并中断循环。在第二部分,如果尚未遇到该条目,则将其final_data作为字典附加到列表中,并将其所有值转换为列表。如果它已经存在 - 数据被合并。这里有两个选项,一个,注释掉的一个,如果值不相同/不存在,它将所有内容合并在一起。这对于很容易重复的商品价格之类的东西不利,但为了完整起见,我保留了它。在第二个当前版本中,它只是查找特定的项目键并与它们合并。这假定即使 中有重复项gifts,也应该包括它们。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python