I have a list of dictionaries in the following format:
foo = [
{'a': 'x', 'b': 'y', 'c': 'z'},
{'a': 'j', 'c': 'z'}
]
I want to group this list of dictionaries into a single dictionary, like:
bar = {
'a': ['x', 'j'],
'b': ['y', None],
'c': ['z', 'z']
}
What I've currently done is, looping through all the dicts in foo and create a list of keys and then looping again over the same to create bar. I wonder whether there is a simpler way to accomplish this. Can anyone help?
I am just going to complement Alex Hall solution here, so that it does not return a lot of "None" values:
def merge_dictionary_list(dict_list):
return {
k: [d.get(k) for d in dict_list if k in d] # explanation A
for k in set().union(*dict_list) # explanation B
}
Explanation:
{} is a dictionary comprehensionk if the current dictionary (d) being evaluated actually has that key.OBS: Without the if k in d expression there could be a bunch of None
values appended to the arrays in case the list of dictionaries
contains different types of keys.
set().union. After all we can only have distinct elements in set data structure.If you want to do it the traditional way, just go with:
def merge_list_of_dictionaries(dict_list):
new_dict = {}
for d in dict_list:
for d_key in d:
if d_key not in new_dict:
new_dict[d_key] = []
new_dict[d_key].append(d[d_key])
return new_dict
I think the first solution looks more elegant, but the second one is more legible/readable.
Kind Regards :)
bar = {
k: [d.get(k) for d in foo]
for k in set().union(*foo)
}
Things to google:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With