2016-09-23 40 views
-1

我想要在python中做一个简单的方法。从python中的键值对的现有列表创建一个列表

我有字母和数字的对,像这样的列表:

[(a,1),(a,2),(a,3),(b,10),(b,100),(c,99),(d,-1),(d,-2)] 

我想要做的就是创建一个新的列表,每个字母和所有的数值追加到它。

因此,输出应该是这样的:

alist = [1,2,3] 
blist = [10,100] 
clist = [99] 
dlist = [-1,-2] 

有没有在Python这样做的简洁的方式?

+2

你听说过defaultdict吗? –

+0

@AvinashRaj:我没有。谢谢 – Piyush

回答

2
from collections import defaultdict 

data = [('a',1),('a',2),('a',3),('b',10),('b',100),('c',99),('d',-1),('d',-2)] 

if __name__ == '__main__': 
    result = defaultdict(list) 

    for alphabet, number in data: 
     result[alphabet].append(number) 

或不收集模块:

if __name__ == '__main__': 
    result = {} 
    for alphabet, number in data: 
     if alphabet not in result: 
      result[alphabet] = [number, ] 
      continue 
     result[alphabet].append(number) 

但我认为,第一个解决方案更有效和明确。

+0

如果我不想使用集合库,是否还有一种不使用defaultdict的方法? – Piyush

+0

是的,当然你可以做到这一点没有defaultdict,见编辑答案 – ShabashP

-1

您可以使用defaultdictcollections模块是:

from collections import defaultdict 

l = [('a',1),('a',2),('a',3),('b',10),('b',100),('c',99),('d',-1),('d',-2)] 
d = defaultdict(list) 

for k,v in l: 
    d[k].append(v) 

for k,v in d.items(): 
    exec(k + "list=" + str(v)) 
1

如果你想避免使用defaultdict但舒适的使用itertools,你可以用一个班轮

from itertools import groupby 

data = [('a',1),('a',2),('a',3),('b',10),('b',100),('c',99),('d',-1),('d',-2)] 
grouped = dict((key, list(pair[1] for pair in values)) for (key, values) in groupby(data, lambda pair: pair[0])) 
# gives {'b': [10, 100], 'a': [1, 2, 3], 'c': [99], 'd': [-1, -2]} 
+0

我实际上实现了我自己的字典。不过谢谢你 – Piyush

0

在看到线程中的响应并阅读defaultdict的实现后,我实现了自己的版本,因为我不想使用集合库。

mydict = {} 
    for alphabet, value in data: 
     try: 
      mydict[alphabet].append(value) 
     except KeyError: 
      mydict[alphabet] = [] 
      mydict[alphabet].append(value) 
相关问题