[英]Python: How to sum dict values with shared key
如果相同的键,我有 json 格式的键值对只需要对同一集合内的另一个键的值求和。
例如,
obj=[{'A': 1, 'X': 5}, {'B' : 5, 'X': 2 },{'A': 1, 'X': 8}]
如果上面的 A 键匹配,我想对 X 键值求和,例如 5+8 = 13。我期望删除 A 的重复键并仅对 X 值求和,最终得到如下所示的输出。
obj=[{'A': 1, 'X': 13}, {'B' : 5, 'X': 2 }]
我已经尝试过类似下面的方法,但没有工作。
>>> for i in range(0, len(obj)):
... for z in range(0, len(obj)):
... if obj[i] == obj[z]:
... print(obj[i]['A'])
将键值对转换为tuple
( "X"
除外),然后将该tuple
用作新dict
中的键以将"X"
的值相加。 之后,它只是重新格式化以获得答案。
d = dict.fromkeys(((k, v) for el in obj for k, v in el.items() if k != "X"), 0)
for k, v in d.keys():
for item in obj:
if item.get(k) and item[k] == v:
d[(k, v)] += item["X"]
ans = []
for k, v in d.items():
curr = {}
curr[k[0]] = k[1]
curr["X"] = v
ans.append(curr)
ans
# [{'A': 1, 'X': 13}, {'B': 5, 'X': 2}]
这就是我想出的。 它对列表进行排序。 然后使用itertools.groupby
按键分组。 然后用该组构建一个新字典。
obj=[{'A': 1, 'X': 5}, {'B' : 5, 'X': 2 },{'A': 1, 'X': 8}]
sorted_list = sorted(obj, key=lambda x: next(iter(x.items())))
res = []
for key,group in itertools.groupby(sorted_list, key=lambda x: next(iter(x.items()))):
d = next(group).copy()
for o in group:
d['X'] += o['X']
res.append(d)
如果它是一个大型(ish)数据集, pandas
可能会提供一些效率提升并节省一些嵌套迭代。
例如:
obj
列表读入 DataFrame'X'
值的dict
import pandas as pd
l = []
d = {}
df = pd.DataFrame(obj, dtype=object)
for col in df:
if col == 'X': continue
tmp = df.loc[~df[col].isnull(), [col, 'X']]
l.append({col: tmp[col].iloc[0],
'X': tmp['X'].sum()})
输出:
[{'A': 1, 'X': 13}, {'B': 5, 'X': 2}]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.