Python itertools.groupby 多个值

1 投票
1 回答
5112 浏览
提问于 2025-04-17 19:19

我从数据库里拿到的数据记录长这样:

region       month_taken         total_att num_classes
Colorado    2013-01-01 00:00:00.000 78485   4648
Colorado    2013-02-01 00:00:00.000 71769   4162
Midwest     2013-01-01 00:00:00.000 110508  7101
Midwest     2013-02-01 00:00:00.000 103545  6410

我想把它们整理成这样的列表:

总出勤人数(Total_att):

[{"data": [78485, 71769], "name": "Colorado"}, {"data": [110508, 103545], "name": "Midwest"}]

课程数量(num_classes):

[{"data": [4648, 4162], "name": "Colorado"}, {"data": [7101, 6410], "name": "Midwest"}]

我发现了一个叫 itertools.groupby 的工具,它可以帮我实现这个目标,但我在处理多个值列表的时候遇到了困难(没找到更好的说法)。

totalResults = []            
for key, location in groupby(rows, lambda k: k[0]):
    totalRow = dict()
    totalRow['name'] = key
    totalRow['data'] = [x[2] for x in location]
    totalResults.append(totalRow)

很好,这样我得到了总出勤人数的列表,但接下来我又要做一个额外的 groupby 循环来创建“课程数量”的列表,这感觉有点荒谬。我在文档里看到了这个,但老实说我不太明白它的意思,或者如果我把它转换成列表后该怎么处理我的问题:

返回的组本身是一个迭代器,它与 groupby() 共享底层的可迭代对象。因为源是共享的,当 groupby() 对象向前推进时,之前的组就不再可见。所以,如果后面需要这些数据,应该把它存储为列表:

那么,我该如何在不进行多个 for key, location in groupby(rows, lambda k: k[0]): 的情况下创建我的列表呢?

我希望这样说清楚了,但如果需要更多信息,我很乐意提供。

1 个回答

4
totalResults = [] 
totalClasses = []           
for key, location in groupby(rows, lambda k: k[0]):
    location = list(location)
    totalResults.append(dict(name=key, data=[x[2] for x in location]))
    totalClasses.append(dict(name=key, data=[x[3] for x in location]))

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答