将列表内的对象按其内的值分组

时间:2019-05-02 16:44:32

标签: python python-3.x list data-structures

在flask应用程序中(与我的问题无关),我有一个存储结果列表的数据库。每个结果都是一个带有分数和时间字符串的对象;在json中看起来像这样

[{"score": 8, "time": "02/05/2019"}, {"score": 10, "time": "02/05/2019"}, {"score": 7, "time": "01/05/2019"}]

我想将具有相同时间的对象分组为相同类型的新对象,其得分是所分组对象的得分的平均值。所以我想将上面的列表转换成类似这样的内容

[{/* Average of the scores with the same time */ "score": 9, "time": "02/05/2019"}, /* Other values */]

我必须添加它。我不知道为什么将其标记为重复,因为链接的问题不完整,没有重点,只有一个答案(无论如何我都无法使用,因为它使用了外部库,我也不想添加任何内容我的项目的第三方库)。链接的问题是有关元组列表(不是键,值对)的,我要的是对象列表和分组结果的平均值。

1 个答案:

答案 0 :(得分:0)

这是使用itertools.groupby

的一种方法

例如:

from itertools import groupby

data = [{"score": 8, "time": "02/05/2019"}, {"score": 10, "time": "02/05/2019"}, {"score": 7, "time": "01/05/2019"}]
result = []
for k, v in groupby(sorted(data, key=lambda x: x["time"]), lambda x: x["time"]):
    val = list(v)
    score = 0
    for i in val:
        score += i["score"]
    result.append({"time": k, "score": score/len(val)})
print(result)

输出:

[{'time': '01/05/2019', 'score': 7.0}, {'time': '02/05/2019', 'score': 9.0}]