繁体   English   中英

Python:如何使用共享键对字典值求和

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM