Python itertools.groupby 多个值
我从数据库里拿到的数据记录长这样:
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]))
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。