I have a dictionary of the format:
JavaScript
x
11
11
1
d = {'award1' : { 'nominees': ['name1', 'name2'],
2
'presenters': ['name3', 'name4'],
3
'winner' : 'name1'
4
}
5
'award2' : { 'nominees': ['name5', 'name6'],
6
'presenters': ['name7', 'name8'],
7
'winner' : 'name6'
8
}
9
}
10
11
And I’m trying to create a list of dictionaries that separate the values, i.e., the result should be:
JavaScript
1
5
1
my_list = [ { 'award1': ['name1','name2'], 'award2': ['name5','name6'] },
2
{ 'award1': ['name3','name4'], 'award2': ['name7','name8'] },
3
{ 'award1': 'name1', 'award2': 'name6' }
4
]
5
Is there a way I can do this with a one-line list comprehension?
What I have tried so far:
JavaScript
1
2
1
lst = [{key:val['nominees'], key:val['presenters'], key:val['winner']} for key, val in d.items()]
2
And my code using a normal “for” loop:
JavaScript
1
7
1
nominees, winner, presenters = {}, {}, {}
2
for key, val in d.items():
3
nominees[key] = val['nominees']
4
winner[key] = val['winner']
5
presenters[key] = val['presenters']
6
lst = [nominees, winner, presenters]
7
Advertisement
Answer
Here’s a list comprehension + dictionary comprehension version of one-liner to achieve this:
JavaScript
1
22
22
1
d = {
2
'award1' : {
3
'nominees': ['name1', 'name2'],
4
'presenters': ['name3', 'name4'],
5
'winner' : 'name1'
6
},
7
'award2' : {
8
'nominees': ['name5', 'name6'],
9
'presenters': ['name7', 'name8'],
10
'winner' : 'name6'
11
}
12
}
13
14
# List of keys to maintain the order of elements in the desired list
15
nested_keys = ['nominees', 'presenters', 'winner']
16
17
# In Python 3.7+: If the insertion order of key in initial dict is same as
18
# order of desired list, we can use this to make it more generic
19
# nested_keys = list(d.values())[0].keys()
20
21
new_list = [{k: d[k][key] for k in d.keys()} for key in nested_keys]
22
where new_list
will hold:
JavaScript
1
6
1
[
2
{'award1': ['name1', 'name2'], 'award2': ['name5', 'name6']},
3
{'award1': ['name3', 'name4'], 'award2': ['name7', 'name8']},
4
{'award1': 'name1', 'award2': 'name6'}
5
]
6