从python中的现有键值对列表创建列表

时间:2016-09-23 06:42:52

标签: 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中有这种巧妙的方法吗?

4 个答案:

答案 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))