2013-06-11 103 views
3

我有一個像Python列表與dict

['a', '2'] ['a', '1'] ['b', '3'] ['c', '2'] ['b', '1'] ['a', '1']['b', '1'] ['c', '2']['b', '3'] ['b', '1'] 

我想通過這個來走,讓每一個第二項的數目的輸出,適用於不同的第一項巨大的名單:

{a:[2,1,1] b:[3,1,3,1] c:[2,2]} 
+0

「巨​​大」有多大? – Gabe

+0

我有一個這樣的約一萬行,這只是一個例子 – user1189851

+0

你有清單的名單? –

回答

10
data = [['a','2'],['a','1'],['b','3'],['c','2'],['b','1'],['a','1'],['b','1'],['c','2'],['b','3'],['b','1']] 
result = {} 
for key, value in data: 
    result.setdefault(key, []).append(value) 

結果:

>>> result 
{'a': ['2', '1', '1'], 'c': ['2', '2'], 'b': ['3', '1', '1', '3', '1']} 

我喜歡dict.setdefault()過defaultdict因爲你結束使用普通字典,嘗試訪問不存在的密鑰會引發異常而不是給出值(在本例中爲空列表)。

3

你這裏可以使用collections.defaultdict

>>> from collections import defaultdict 
>>> lis = [['a', '2'], ['a', '1'], ['b', '3'], ['c', '2'], ['b', '1'], ['a', '1'],['b', '1'], ['c', '2'],['b', '3'], ['b', '1']] 
>>> dic = defaultdict(list) 
>>> for k,v in lis: 
     dic[k].append(int(v)) 
>>> dic 
defaultdict(<type 'list'>, {'a': [2, 1, 1], 'c': [2, 2], 'b': [3, 1, 1, 3, 1]}) 
>>> dic['b'] 
[3, 1, 1, 3, 1] 
>>> dic['a'] 
[2, 1, 1] 
+1

是'k,v中的lis'稱爲拆包?就像我們可以做'a,b = [1,2]' –

+1

@GrijeshChauhan是的。 –

5
from collections import defaultdict 

dd = defaultdict(list) 
for k, v in your_list: 
    dd[k].append(v) 

或者您的數據已經排序(刪除排序一步 - 或以其他方式沒關係排序...)

from itertools import groupby 
from operator import itemgetter 
print {k: [v[1] for v in g] for k, g in groupby(sorted(d), itemgetter(0))} 
+2

@GrijeshChauhan這實際上是Python文檔中['defaultdict']的示例代碼(http://docs.python.org/2/library/collections.html#defaultdict-examples):D –