2012-12-05 26 views
2

我有一个这样的名单:转化列表

[['0', '10'], ['0', '11'], ['0', '12'], ['1', '10'], ['1', '11']] 

哪能组在列表中的元素,例如像上面?

['0': ['10','11','12']],['1': ['10','11']] 
+1

您的意思是有[ '1', '11']作为最后一个项目列表? –

+0

@FarukSahin panpa是的,我编辑它 – tchike

+1

结果中键('0'和'1')的顺序很重要吗? – NPE

回答

6

迭代 - 放入字典。

d = {} 
l = [['0', '10'], ['0', '11'], ['0', '12'], ['1', '10'], ['1', '11']] 
for p in l: 
    if p[0] in d: 
     d[p[0]].append(p[1]) 
    else: 
     d[p[0]] = [p[1]] 

>>> d 
{'1': ['10', '11'], '0': ['10', '11', '12']} 

使用defaultdict

from collections import defaultdict 

d = defaultdict(list) 
l = [['0', '10'], ['0', '11'], ['0', '12'], ['1', '10'], ['1', '11']] 
for p in l: 
    d[p[0]].append(p[1]) 

一行代码:使用dict comprehension(有点浪费,但没有进口,并要求2.7+)

>>> dd = {key: [i[1] for i in l if i[0] == key] for (key, value) in l} 
>>> dd 
{'1': ['10', '11'], '0': ['10', '11', '12']} 
+1

这个单线程将在python 2.6以及2.7:'dict((key,[i [1] for i in l if i [0] == key])for键,值)in l)',尽管基于groupby()的解决方案在这里好得多。 –

5

你可以使用collections.defaultdict

import collections 

l = [['0', '10'], ['0', '11'], ['0', '12'], ['1', '10'], ['1', '11']] 

d = collections.defaultdict(list) 
for k, v in l: 
    d[k].append(v) 
print(d) 
2

您可以使用dict.setdefault()

In [16]: lis=[['0', '10'], ['0', '11'], ['0', '12'], ['1', '10'], ['1', '11']] 

In [17]: dic={} 

In [18]: for x,y in lis: 
    ....:  dic.setdefault(x,[]).append(y) 
    ....:  

In [19]: dic 
Out[19]: {'0': ['10', '11', '12'], '1': ['10', '11']} 

和名单也甚至itertools.groupby将正常工作:

In [39]: from operator import itemgetter 

In [40]: from itertools import groupby 

In [34]: lis=[['0', '10'], ['0', '11'], ['0', '12'], ['1', '10'], ['1', '11']] 

In [35]: {k:[x[1] for x in g] for k,g in groupby(lis,key=itemgetter(0))} 
Out[35]: {'0': ['10', '11', '12'], '1': ['10', '11']}