Python itertools.groupby多个值

Python itertools.groupby多个值,python,Python,我从数据库返回的记录如下所示: 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.

我从数据库返回的记录如下所示:

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
我正在尝试将它们放入列表中,以便:

总附件:

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

[{"data": [4648, 4162], "name": "Colorado"}, {"data": [7101, 6410], "name": "Midwest"}]
我发现itertools.groupby可以实现我想要的功能,但我很难使用多个值列表(因为缺少更好的术语)

太好了,这让我得到了我的总类列表,但是我做了一个完整的额外的groupby循环来创建“num_类”列表,这看起来很可笑。我在文档中看到了这一点,但老实说,如果我将其转换为列表,我不太确定这意味着什么,也不知道如何处理我的问题:

返回的组本身是一个迭代器,它与groupby()共享底层iterable。因为源是共享的,所以当groupby()对象处于高级状态时,上一个组将不再可见。因此,如果以后需要该数据,则应将其存储为列表:

那么,我如何创建列表而不在groupby(rows,lambda k:k[0])中对key,location执行多次操作呢


我希望这是清楚的,但我很乐意提供更多必要的信息。

请注意,您应该使用
lambda
函数,而不是
lambda。(如果您使用gnibbler的答案,那么您可以将itemgetter存储到一个变量中,并使用它两次以节省创建同一事物的时间)。您可以使用从单个iterable创建两个独立的迭代器。先生,您是一个救生员。我花了很长时间寻找解决办法。非常感谢你!
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]))
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]))