Python combine values of identical dictionaries without using looping

Viewed 71

I have list of identical dictionaries:

my_list = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}]

I need to get something like this:

a = [1, 4, 7]
b = [2, 5, 8]
c = [3, 6, 9]

I know how to do in using for .. in .., but is there way to do it without looping? If i do

a, b, c = zip(*my_list)

i`m getting

a = ('a', 'a', 'a')
b = ('b', 'b', 'b')
c = ('c', 'c', 'c')

Any solution?

4 Answers

You need to extract all the values in my_list.You could try:

my_list = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}]
a, b, c = zip(*map(lambda d: d.values(), my_list))
print(a, b, c)

# (1, 4, 7) (2, 5, 8) (3, 6, 9)

Pointed out by @Alexandre,This work only when the dict is ordered.If you couldn't make sure the order, consider the answer of yatu.

You will have to loop to obtain the values from the inner dictionaries. Probably the most appropriate structure would be to have a dictionary, mapping the actual letter and a list of values. Assigning to different variables is usually not the best idea, as it will only work with the fixed amount of variables.

You can iterate over the inner dictionaries, and append to a defaultdict as:

from collections import defaultdict

out = defaultdict(list)
for d in my_list:
    for k,v in d.items():
        out[k].append(v)

print(out)
#defaultdict(list, {'a': [1, 4, 7], 'b': [2, 5, 8], 'c': [3, 6, 9]})

Pandas DataFrame has just a factory method for this, so if you already have it as a dependency or if the input data is large enough:

import pandas as pd
my_list = ...
df = pd.DataFrame.from_rows(my_list)
a = list(df['a']) # df['a'] is a pandas Series, essentially a wrapped C array
b = list(df['b'])
c = list(df['c'])

Please find the code below. I believe that the version with a loop is much easier to read.

my_list = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}]

# we assume that all dictionaries have the sames keys
a, b, c = map(list, map(lambda k: map(lambda d: d[k], my_list), my_list[0]))
print(a,b,c)
Related