按照django中的键值对字典列表进行分组

时间:2018-03-01 15:45:42

标签: python django

我有一个字典列表如下

[{'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}]

6 个答案:

答案 0 :(得分:5)

而不是从past_enrollmentscurrent_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。你被允许使用熊猫吗?然后,您可以使用groupbyto_dict。还需要sumreset_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,因为有更有效的方法可以做到这一点,并且可能有一种方法。

这也是假设列表大小相同。

有关迭代的更多信息,请参阅下面的答案

How to iterate through two lists in parallel?

https://stackoverflow.com/a/1663826/5990760

相关问题