在dict列表上做groupby的python方法(高效吗?)

2024-05-20 23:17:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力在dict列表中找到一个令人信服的python方法来执行groupby,下面似乎有很好的可读性,但并不一定是最有效的方法:我必须先排序(groupby的先决条件),然后再执行groupby(这里还有一个问题,这是itertools中groupby是如何实现的……)。在

一个明显的选择是使用集合.defaultdict但我得做很多事列表.追加(和更少的Python?)。你们觉得哪个更好?或者还有其他更好的方法来分组?谢谢

from itertools import groupby
from operator import itemgetter

data = [ {'x':1, 'y':1},
         {'x':2, 'y':2},
         {'x':3, 'y':2},
         {'x':4, 'y':1}, ]

sortedData = sorted(data, key=itemgetter('y'))

for y, d in groupby( sortedData, itemgetter('y')):
    print y, list(d)

1 [{'y': 1, 'x': 1}, {'y': 1, 'x': 4}]
2 [{'y': 2, 'x': 2}, {'y': 2, 'x': 3}]

Tags: 方法fromimport列表data排序先决条件operator
2条回答

要对无序列表进行分组,需要检查列表中的每个对象,并将其放入一个组中:

def groupby(iterable, keyfunc=id):
    result = []
    groups = {}
    for item in iterable:
        key = keyfunc(item)
        group = groups.get(key)
        if group is None:
            groups[key] = group = []
            result.append((key,group))
        group.append(item)
    return result

如您所知,defaultdict是一种选择。我不确定“Python病”,但它似乎快了两倍(正如你所问的效率):

from collections import defaultdict
def f(l):
    d = defaultdict(list)
    for i in data: 
        d[i.get('y')].append(i)
    return d

%timeit f(data)
100000 loops, best of 3: 3.7 us per loop

%timeit {y:list(d) for y, d in groupby(sorted(data, key=itemgetter('y')),
                                                        itemgetter('y'))}
100000 loops, best of 3: 8.33 us per loop

相关问题 更多 >