我想在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中有这种巧妙的方法吗?
答案 0 :(得分: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)
但我认为,第一种解决方案更有效,更清晰。
答案 1 :(得分:1)
如果您想避免使用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]}
感觉很舒服,可以使用单行
composer install
答案 2 :(得分:0)
在线程中看到响应并阅读defaultdict的实现后,我实现了自己的版本,因为我不想使用集合库。
mydict = {}
for alphabet, value in data:
try:
mydict[alphabet].append(value)
except KeyError:
mydict[alphabet] = []
mydict[alphabet].append(value)
答案 3 :(得分:-1)
您可以使用defaultdict
模块中的collections
:
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))