简体   繁体   中英

Create a list from an existing list of key value pairs in python

I am trying to come up with a neat way of doing this in python.

I have a list of pairs of alphabets and numbers that look like this :

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

What I want to do is to create a new list for each alphabet and append all the numerical values to it.

So, output should look like:

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

Is there a neat way of doing this in Python?

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)

or without collections module:

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

But i think, that first solution more effective and clear.

If you want to avoid using a defaultdict but are comfortable using itertools , you can do it with a one-liner

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]}

After seeing the responses in the thread and reading the implementation of defaultdict, I implemented my own version of it since I didn't want to use the collections library.

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

You can use defaultdict from the collections module for this:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM