2011-02-12 50 views
2

考慮下面的簡單情況列表中,列出:Python的 - 劃分到組

lol = [['John','Polak',5,3,7,9], 
     ['John','Polak',7,9,2,3], 
     ['Mark','Eden' ,0,3,3,1], 
     ['Mark','Eden' ,5,1,2,9]] 

這將是一個Python化和內存+高速高效方式這個列表中,列出轉變爲列表中,列出了-的,列出了基於前兩個參數:

lolol = [[['John','Polak',5,3,7,9], 
      ['John','Polak',7,9,2,3]], 
     [['Mark','Eden' ,0,3,3,1], 
      ['Mark','Eden' ,5,1,2,9]]] 

其實 - 任何其他數據結構也將是沒關係,只要我有正確的層次結構。例如,下面的字典結構出現了,但創建它看起來效率並不高,並且內存可能比lolol解決方案高。

dolol = {('John','Polak'):[[5,3,7,9],[7,9,2,3]], 
     ('Mark','Eden') :[[0,3,3,1],[5,1,2,9]]} 
+0

是輸入列表總是被鍵進行排序,或者可能它是混合順序? – 2011-02-12 20:28:22

回答

0

要使用Python的2當量補充delnan的回答是:

from collections import defaultdict 

dolol=defaultdict(list) 
for data in lol: 
    dolol[data[0],data[1]].append(data[2:]) 
5

如果字典是可以接受的,此代碼將創建一個:

import collections 
d = collections.defaultdict(list) 
for name, surname, *stuff in lol: 
    d[name, surname].append(nums) 

注意,這需要Python 3(extended iterable unpacking)。對於Python 2,請使用

for x in lol: 
    name = x[0] 
    surname = x[1] 
    stuff = x[2:] 

您可以摺疊變量以保存行。

6

列表:

from itertools import groupby 
lolol = [list(grp) for (match, grp) in groupby(lol, lambda lst: lst[:2])] 
# [[['John', 'Polak', 5, 3, 7, 9], ['John', 'Polak', 7, 9, 2, 3]], 
# [['Mark', 'Eden', 0, 3, 3, 1], ['Mark', 'Eden', 5, 1, 2, 9]]] 

詞典:

dolol = dict((tuple(match), [x[2:] for x in grp]) for (match, grp) in 
      groupby(lol, lambda lst: lst[:2])) 
# {('John', 'Polak'): [[5, 3, 7, 9], [7, 9, 2, 3]], 
# ('Mark', 'Eden'): [[0, 3, 3, 1], [5, 1, 2, 9]]} 

由於itertools.groupby作品上連續比賽,它假設排序輸入(lol)。