簡體   English   中英

對鍵相同的列表中的字典值求和

[英]Sum the values of dictionaries inside a list where the keys are the same

我有 4 個字典列表,每個列表包含 4 個字典。 這些列表看起來類似於:

    A = [
     {'1': 150, '2': 160, '3': 140, '4': 110},
     {'1': 230, '2': 650, '3': 134, '4': 650},  
     {'1': 220, '2': 530, '3': 980, '4': 3450},  
     {'1': 150, '2': 160, '3': 440, '4': 110}]

    B = [
     {'1': 165, '2': 430, '3': 134, '4': 650},
     {'1': 64, '2': 650, '3': 345, '4': 340},  
     {'1': 220, '2': 650, '3': 340, '4': 134},  
     {'1': 150, '2': 160, '3': 234, '4': 2340}]

    C = [
     {'1': 678, '2': 430, '3': 134, '4': 650},
     {'1': 344, '2': 650, '3': 345, '4': 340},  
     {'1': 220, '2': 650, '3': 340, '4': 134},  
     {'1': 150, '2': 160, '3': 234, '4': 2340}]

    D = [
     {'1': 165, '2': 430, '3': 134, '4': 650},
     {'1': 64, '2': 650, '3': 345, '4': 340},  
     {'1': 220, '2': 650, '3': 340, '4': 134},  
     {'1': 150, '2': 160, '3': 234, '4': 1440}]

我想總結每個列表的第一個字典的值,其中鍵是相同的(所以對於鍵'1',然后對於'2',然后對於'3'等等...),連同列表 rest 的第一個字典的值。
然后對第二個、第三個和第四個字典執行相同的操作。

預期的結果應該是 4 個字典,它們保持鍵的順序,同時對相同鍵的值求和。

我試過下面的代碼:

for i in range (4):
    dict1 = A[i]
    dict2 = B[i]
    dict3 = C[i]
    dict4 = D[i]
# adding the values with common key      
    Cdict = Counter(dict1) + Counter(dict2) + Counter(dict3) + Counter(dict4)
    print(Cdict)

但問題是鍵的順序正在改變:

Counter({'4': 2060, '2': 1450, '1': 1158, '3': 542})
Counter({'2': 2600, '4': 1670, '3': 1169, '1': 702})
Counter({'4': 3852, '2': 2480,'3': 2000, '1': 880})
Counter({'4': 6230, '3': 1142, '2': 640, '1': 600})

IIUC 這很簡單。 您只需編寫一個 function 來總結每個鍵的所有值。 然后將其應用於字典列表的轉置列表。

def sum_by_key(dicts):
    result = {}

    for d in dicts:
        for k, v in d.items():
            result[k] = result.get(k, 0) + v

    return result

lists_of_dicts = [[{1:2, 3:4}, {1:10, 2:9}], [{3:8, 2:4}, {3:1, 2:5}]]
result = [sum_by_key(dicts) for dicts in zip(*lists_of_dicts)]

print(result)

lists_of_dicts將是[A, B, C, D]和你的變量)

Output:

[{1: 2, 3: 12, 2: 4}, {1: 10, 2: 14, 3: 1}]

編輯:使用您的新示例數據

lists_of_dicts = [A, B, C, D]
result = [sum_by_key(dicts) for dicts in zip(*lists_of_dicts)]
print(result)

產生

[{'1': 1158, '2': 1450, '3': 542, '4': 2060}, {'1': 702, '2': 2600, '3': 1169, '4': 1670}, {'1': 880, '2': 2480, '3': 2000, '4': 3852}, {'1': 600, '2': 640, '3': 1142, '4': 6230}]

我使用 numpy。順便說一句,我認為你給出的結果不正確,我的代碼如下:

results:
{'1': 1158, '2': 1450, '3': 542, '4': 2060}
{'1': 702, '2': 2600, '3': 1169, '4': 1670}
{'1': 880, '2': 2480, '3': 2000, '4': 3852}
{'1': 600, '2': 640, '3': 1142, '4': 6230}

import numpy as np

A = [
    {'1': 150, '2': 160, '3': 140, '4': 110},
    {'1': 230, '2': 650, '3': 134, '4': 650},
    {'1': 220, '2': 530, '3': 980, '4': 3450},
    {'1': 150, '2': 160, '3': 440, '4': 110}]

B = [
    {'1': 165, '2': 430, '3': 134, '4': 650},
    {'1': 64, '2': 650, '3': 345, '4': 340},
    {'1': 220, '2': 650, '3': 340, '4': 134},
    {'1': 150, '2': 160, '3': 234, '4': 2340}]

C = [
    {'1': 678, '2': 430, '3': 134, '4': 650},
    {'1': 344, '2': 650, '3': 345, '4': 340},
    {'1': 220, '2': 650, '3': 340, '4': 134},
    {'1': 150, '2': 160, '3': 234, '4': 2340}]

D = [
    {'1': 165, '2': 430, '3': 134, '4': 650},
    {'1': 64, '2': 650, '3': 345, '4': 340},
    {'1': 220, '2': 650, '3': 340, '4': 134},
    {'1': 150, '2': 160, '3': 234, '4': 1440}]

group_list = [A,B,C,D]
items_num = len(A)
results =  []

for i in range(items_num):
    cur_item_dict = dict()

    for key in A[0].keys():
        cur_item_dict[key] = np.sum([ls[i][key]  for j, ls in enumerate(group_list)])

    results.append(cur_item_dict)

print('results:')
for res in results:
print(res)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM