Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unpack list of dictionaries in Python

Question

According to this answer, in Python 3.5 or greater, it is possible to merge two dictionaries x and y by unpacking them:

z = {**x, **y}

Is it possible to unpack a variadic list of dictionaries? Something like

def merge(*dicts):
    return {***dicts} # this fails, of course. What should I use here?

For instance, I would expect that

list_of_dicts = [{'a': 1, 'b': 2}, {'c': 3}, {'d': 4}]
{***list_of_dicts} == {'a': 1, 'b': 2, 'c': 3, 'd': 4}

Note that this question is not about how to merge lists of dictionaries since the link above provides an answer to this. The question here is: is it possible, and how, to unpack lists of dictionaries?

Edit

As stated in the comments, this question is very similar to this one. However, unpacking a list of dictionaries is different from simply merging them. Supposing that there was an operator *** designed to unpack lists of dictionaries, and given

def print_values(a, b, c, d):
    print('a =', a)
    print('b =', b)
    print('c =', c)
    print('d =', d)

list_of_dicts = [{'a': 1, 'b': 2}, {'c': 3}, {'d': 4}]

it would be possible to write

print_values(***list_of_dicts)

instead of

print_values(**merge(list_of_dicts))
like image 812
ruancomelli Avatar asked Nov 19 '19 18:11

ruancomelli


People also ask

Can we unpack dictionary in Python?

Unpacking Dictionaries With the ** Operator In the context of unpacking in Python, the ** operator is called the dictionary unpacking operator. The use of this operator was extended by PEP 448. Now, we can use it in function calls, in comprehensions and generator expressions, and in displays.

How do I iterate a list of dictionaries in Python?

In Python, to iterate the dictionary ( dict ) with a for loop, use keys() , values() , items() methods. You can also get a list of all keys and values in the dictionary with those methods and list() . Use the following dictionary as an example. You can iterate keys by using the dictionary object directly in a for loop.

How do I unpack a dictionary?

We can use the ** to unpack dictionaries and merge them in a new dict object. In the above example, we create a new dictionary by unpacking the contents of the previous dictionary in the new dictionary. We also have an operator to unpack elements from the list.

How do you unpack a list in Python?

Summary. Unpacking assigns elements of the list to multiple variables. Use the asterisk (*) in front of a variable like this *variable_name to pack the leftover elements of a list into another list.


2 Answers

Another solution is using collections.ChainMap

from collections import ChainMap

dict(ChainMap(*list_of_dicts[::-1]))

Out[88]: {'a': 1, 'b': 2, 'c': 3, 'd': 4}
like image 74
Andy L. Avatar answered Oct 21 '22 18:10

Andy L.


You could just iterate over the list and use update:

lst = [{'a': 1, 'b': 2}, {'c': 3}, {'d': 4}]

dct = {}
for item in lst:
    dct.update(item)

print(dct)
# {'a': 1, 'b': 2, 'c': 3, 'd': 4}
like image 44
Jan Avatar answered Oct 21 '22 20:10

Jan