2016-10-28 23 views
1

組列表我有一個看起來像這樣的列表:Python的方式來者皆

[ 
    [1, "a", 319], 
    [1, "b", 991], 
    [2, "Cd", 19], 
    [3, "88x", 2891], 
    [3, "foo", 11] 
] 

是什麼把這個變成最「Python化」的方式:

[ 
    [1, [["a", 319], ["b", 991]]], 
    [2, [["Cd", 19]]], 
    [3, [["88x", 2891], ["foo", 11]]] 
] 

我知道如何使用for循環等來做到這一點,但我正在採用更簡潔的方法。

+0

我想你想'groupby':https://docs.python.org/2/library/itertools.html#itertools.groupby – Phrogz

+0

'collections.DefaultDict'可能更容易。 – TigerhawkT3

回答

2

下面是一個選項假設列表是由第一個元素的前手排序:

from itertools import groupby  
[[k, [x[1:] for x in g]] for k, g in groupby(lst, key = lambda x: x[0])] 

#[[1, [['a', 319], ['b', 991]]], 
# [2, [['Cd', 19]]], 
# [3, [['88x', 2891], ['foo', 11]]]] 
+0

工作。對我來說排序列表是可能的,因爲它來自數據庫SQL查詢。 – felamaslen

0

你也可以使用一個collections.defaultdict,如果你不介意一個類似於字典的對象:

>>> l = [ 
... [1, "a", 319], 
... [1, "b", 991], 
... [2, "Cd", 19], 
... [3, "88x", 2891], 
... [3, "foo", 11] 
... ] 
>>> import collections 
>>> d = collections.defaultdict(list) 
>>> for k, *v in l: 
...  d[k].append(v) 
... 
>>> import pprint 
>>> pprint.pprint(d) 
{1: [['a', 319], ['b', 991]], 
2: [['Cd', 19]], 
3: [['88x', 2891], ['foo', 11]]}