[英]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.