我有一个字典列表如下
[{'grade': '1', 'past_student_sum': 1611},
{'grade': '2', 'past_student_sum': 1631},
{'grade': '3', 'past_student_sum': 1598},
{'grade': '1', 'current_student_sum': 1611},
{'grade': '2', 'current_student_sum': 1631},
{'grade': '3', 'current_student_sum': 1598}]
我通过以下列方式组合2个查询集来获得此列表:
grade_list = list(past_enrollments) + list(current_enrollments)
是否有更好的替代方法可以将这些组合起来以获得如下所示的列表:
[{'grade': '1', 'past_student_sum': 1611, 'current_student_sum': 1621},
{'grade': '2', 'past_student_sum': 1511, 'current_student_sum': 1521}]
答案 0 :(得分:5)
而不是从past_enrollments
和current_enrollments
构建字典列表,而是使用grade
值作为键来构建另一个字典。最简单的方法可能是使用defaultdict
from collections import defaultdict
from itertools import chain
grades = defaultdict(dict)
for d in chain(past_enrollments, current_enrollments):
grades[d['grade']].update(d)
然后我们完成的词典只是该词典的值
grades = list(grades.values())
print(grades)
# [{'grade': '1', 'past_student_sum': 1611, 'current_student_sum': 1611},
# {'grade': '2', 'past_student_sum': 1631, 'current_student_sum': 1631},
# {'grade': '3', 'past_student_sum': 1598, 'current_student_sum': 1598}]
答案 1 :(得分:2)
这是一个使用dict按grade
分组和合并记录的解决方案:
from collections import defaultdict
grade_map = defaultdict(dict)
for grade_info in grade_list:
grade_map[grade_info['grade']].update(grade_info)
print(list(grade_map.values()))
答案 2 :(得分:1)
这可能会有所帮助。
# -*- coding: utf-8 -*-
d = [{'grade': '1', 'past_student_sum': 1611},
{'grade': '2', 'past_student_sum': 1631},
{'grade': '3', 'past_student_sum': 1598},
{'grade': '1', 'current_student_sum': 1611},
{'grade': '2', 'current_student_sum': 1631},
{'grade': '3', 'current_student_sum': 1598}]
e = {}
for i in d:
if i["grade"] not in e:
e[i["grade"]] = i
else:
if i.get("current_student_sum", None):
e[i["grade"]].update({"current_student_sum": i["current_student_sum"]})
print [i[1] for i in e.items()]
<强>输出强>:
[{'grade': '1', 'current_student_sum': 1611, 'past_student_sum': 1611}, {'grade': '3', 'current_student_sum': 1598, 'past_student_sum': 1598}, {'grade': '2', 'current_student_sum': 1631, 'past_student_sum': 1631}]
答案 3 :(得分:1)
这可以帮到你。
your_list = [
{'grade': '1', 'past_student_sum': 1611},
{'grade': '2', 'past_student_sum': 1631},
{'grade': '3', 'past_student_sum': 1598},
{'grade': '1', 'current_student_sum': 1611},
{'grade': '2', 'current_student_sum': 1631},
{'grade': '3', 'current_student_sum': 1598}
]
from itertools import groupby
result = []
key_func = lambda x: x['grade']
for i, j in groupby(sorted(your_list, key=key_func), key=key_func):
group = {}
for k in j:
group.update(k)
result.append(group)
print(result)
# [{'grade': '1', 'current_student_sum': 1611, 'past_student_sum': 1611}, {'grade': '2', 'current_student_sum': 1631, 'past_student_sum': 1631}, {'grade': '3', 'current_student_sum': 1598, 'past_student_sum': 1598}]
答案 4 :(得分:1)
我自己更喜欢the answer by Patrick。你被允许使用熊猫吗?然后,您可以使用groupby和to_dict。还需要sum和reset_index。
import pandas as pd
df = pd.DataFrame(grade_list).groupby('grade').sum().reset_index().to_dict('records')
答案 5 :(得分:-1)
import itertools
/////
i = 0
for item1, item2 in itertools.izip_longest(listone,listtwo):
listthree[i] = dict(item1, **item2)
i += 1
我建议看看itertools,因为有更有效的方法可以做到这一点,并且可能有一种方法。
这也是假设列表大小相同。
有关迭代的更多信息,请参阅下面的答案