Search code examples
pythonlistdictionarydictionary-comprehension

Execution order of nested dictionary comprehension


I'm trying to convert this list:

data = [{'A': 123}, {'B': 456}, {'C': 789}]

To this dictionary:

{'A': 123, 'B': 456, 'C': 789}

By using dictionary comprehension:

{key: value for key, value in dictionary.items() for dictionary in data}

Exception:

NameError: name 'dictionary' is not defined

Solution

  • You need to switch your iteration logic. Default order of iteration inside dictionary (or list) comprehension goes from left to right:

    >>> data = [{'A': 123}, {'B': 456}, {'C': 789}]
    
    >>> {k: v for d in data for k, v in d.items()}
    {'A': 123, 'B': 456, 'C': 789}
    

    You can create nested dictionary comprehension, list comprehension or generator expression using {}, [] and () respectively which are the exceptions for the left to right execution order I mentioned earlier. All these operations create new objects, and they execute inside their own scope.