Initialize List to a variable in a Dictionary inside a loop

后端 未结 2 1006
孤城傲影
孤城傲影 2020-11-27 19:28

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.

Bas

相关标签:
2条回答
  • 2020-11-27 19:40

    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'])
    
    0 讨论(0)
  • 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]}
    
    0 讨论(0)
提交回复
热议问题