pythonic方式做字典列表上的groupby(和有效?)
我很努力地找到一个令人信服的pythonic方式来做一个列表字典,下面似乎有良好的可读性,但没有必要的最有效的方式:我必须首先排序(groupby的先决条件),然后通过(另一个问题在这里标记itertools中groupby的实现方式)进行组合。pythonic方式做字典列表上的groupby(和有效?)
一个明显的选择是使用collections.defaultdict,但我将不得不做很多list.append(并减少pythonic?)。哪一个你认为这是一个更好的选择?或者还有其他更好的方法来做群组?谢谢
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}]
回答:
你已经知道defaultdict
是一种选择。我不知道有关“pythonicness”,但它似乎是约快两倍(你问效):
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
回答:
要组一个无序列表,您将需要检查每个对象列表,并将它放到一个组中:
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
以上是 pythonic方式做字典列表上的groupby(和有效?) 的全部内容, 来源链接: utcz.com/qa/261025.html