2013-01-03 73 views
1

我很努力地找到一個令人信服的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}] 
+2

對我很好。爲了實現,請參閱itertools源代碼,這些源代碼可在Python發行版中使用:) –

+1

爲什麼'list.append',當您可以「屈服」或等價使用列表解析? – 2013-01-03 21:53:25

+0

Tinctorius,請你張貼一些示例代碼?對於產量或列表解析來使這項工作更好? – John

回答

1

你已經知道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 
1

要組一個無序列表,您將需要檢查每個對象列表,並將它放到一個組中:

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 
相關問題