I have been working for a while in Python and I have solved this issue using “try” and “except”, but I was wondering if there is another method to solve it.
Basically I want to create a dictionary like this:
example_dictionary = {"red":[2,3,4],"blue":[6,7,8],"orange":[10,11,12]}
So if I have a variable with the following content:
root_values = [{"name":"red","value":2},{"name":"red","value":3},{"name":"red","value":4},{"blue":6}...]
My way to implement the example_dictionary was:
example_dictionary = {}
for item in root_values:
try:
example_dictionary[item.name].append(item.value)
except:
example_dictionary[item.name] =[item.value]
I hope my question is clear and someone can help me with this.
Thanks.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Your code is not appending elements to the lists; you are instead replacing the list with single elements. To access values in your existing dictionaries, you must use indexing, not attribute lookups (item['name'], not item.name).
Use collections.defaultdict():
from collections import defaultdict
example_dictionary = defaultdict(list)
for item in root_values:
example_dictionary[item['name']].append(item['value'])
defaultdict is a dict subclass that uses the __missing__ hook on dict to auto-materialize values if the key doesn’t yet exist in the mapping.
or use dict.setdefault():
example_dictionary = {}
for item in root_values:
example_dictionary.setdefault(item['name'], []).append(item['value'])
Method 2
List and dictionary comprehensions can help here …
Given
In [72]: root_values
Out[72]:
[{'name': 'red', 'value': 2},
{'name': 'red', 'value': 3},
{'name': 'red', 'value': 2},
{'name': 'green', 'value': 7},
{'name': 'green', 'value': 8},
{'name': 'green', 'value': 9},
{'name': 'blue', 'value': 4},
{'name': 'blue', 'value': 4},
{'name': 'blue', 'value': 4}]
A function like item() shown below can extract values with specific names:
In [75]: def item(x): return [m['value'] for m in root_values if m['name']==x]
In [76]: item('red')
Out[76]: [2, 3, 2]
Then, its just a matter of dictionary comprehension …
In [77]: {x:item(x) for x in ['red', 'green', 'blue'] }
Out[77]: {'blue': [4, 4, 4], 'green': [7, 8, 9], 'red': [2, 3, 2]}
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0