用python将相似键的词典条目合并为新的词典条目

2024-05-15 04:04:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下列词典:

{'grade': '7', 'current_student_sum': 1559}
{'grade': '8', 'current_student_sum': 1638}
{'grade': 'KF', 'current_student_sum': 1588}
{'grade': 'KA', 'current_student_sum': 1588}
{'grade': 'PA', 'current_student_sum': 366}
{'grade': 'PF', 'current_student_sum': 54}
{'grade': 'PP', 'current_student_sum': 384}

我试图找到一个最干净的方法来循环通过那里,并以'p'开始对任何等级进行求和(对'K'也一样)

最终结果:

我想让字典看起来像这样:

{'grade': '7', 'current_student_sum': 1559}
{'grade': '8', 'current_student_sum': 1638}
{'grade': 'K', 'current_student_sum': 3176}
{'grade': 'P', 'current_student_sum': 816}

另一种解决方案是:

{
'grade': 'K', 'student_sum': 3176,
'grade': 'P', 'student_sum': 816,
..etc
}

我见过使用Counter的方法,但这仅限于在字典中匹配键的情况

如果把它们列成列表或者做些什么让它更容易些的话,它们不一定要成为字典


Tags: 方法字典counteretccurrent解决方案studentpp
3条回答

使用collections.defaultdict

例如:

import collections
res = collections.defaultdict(int)
data = [{'grade': '7', 'current_student_sum': 1559},
{'grade': '8', 'current_student_sum': 1638},
{'grade': 'KF', 'current_student_sum': 1588},
{'grade': 'KA', 'current_student_sum': 1588},
{'grade': 'PA', 'current_student_sum': 366},
{'grade': 'PF', 'current_student_sum': 54},
{'grade': 'PP', 'current_student_sum': 384}]

for i in data:
    res[i['grade'][0]] += i["current_student_sum"]

res = [{'grade':k, 'current_student_sum':v}  for k,v in res.items()]
print(res)

输出:

[{'current_student_sum': 1638, 'grade': '8'},
 {'current_student_sum': 3176, 'grade': 'K'},
 {'current_student_sum': 1559, 'grade': '7'},
 {'current_student_sum': 804, 'grade': 'P'}]

您可以使用itertools.groupby

import itertools
d = [{'grade': '7', 'current_student_sum': 1559}, {'grade': '8', 'current_student_sum': 1638}, {'grade': 'KF', 'current_student_sum': 1588},{'grade': 'KA', 'current_student_sum': 1588}, {'grade': 'PA', 'current_student_sum': 366}, {'grade': 'PF', 'current_student_sum': 54}, {'grade': 'PP', 'current_student_sum': 384}]
new_d = [[a, list(b)] for a, b in itertools.groupby(sorted(d, key=lambda x:x['grade'][0]), key=lambda x:x['grade'][0])]
final_grade = [{'grade':a, 'current_student_sum':sum(i['current_student_sum'] for i in b)} for a, b in new_d]

输出:

[{'grade': '7', 'current_student_sum': 1559}, 
 {'grade': '8', 'current_student_sum': 1638}, 
 {'grade': 'K', 'current_student_sum': 3176}, 
 {'grade': 'P', 'current_student_sum': 804}]

矢量化解决方案可用于第三方:

import pandas as pd

L = [{'grade': '7', 'current_student_sum': 1559},
     {'grade': '8', 'current_student_sum': 1638},
     {'grade': 'KF', 'current_student_sum': 1588},
     {'grade': 'KA', 'current_student_sum': 1588},
     {'grade': 'PA', 'current_student_sum': 366},
     {'grade': 'PF', 'current_student_sum': 54},
     {'grade': 'PP', 'current_student_sum': 384}]

df = pd.DataFrame(L)

res = df.groupby(df['grade'].str[0])['current_student_sum'].sum()\
        .reset_index().to_dict('records')

print(res)

[{'current_student_sum': 1559, 'grade': '7'},
 {'current_student_sum': 1638, 'grade': '8'},
 {'current_student_sum': 3176, 'grade': 'K'},
 {'current_student_sum': 804, 'grade': 'P'}]

相关问题 更多 >

    热门问题