Search code examples
pythonpython-3.xdictionary-comprehension

understanding nested python dict comprehension


I am getting along with dict comprehensions and trying to understand how the below 2 dict comprehensions work:

select_vals = ['name', 'pay']
test_dict = {'data': [{'name': 'John', 'city': 'NYC', 'pay': 70000}, {'name': 'Mike', 'city': 'NYC', 'pay': 80000}, {'name': 'Kate', 'city': 'Houston', 'pay': 65000}]}
dict_comp1 = [{key: item[key] for key in select_vals } for item in test_dict['data']  if item['pay'] > 65000 ]

The above line gets me [{'name': 'John', 'pay': 70000}, {'name': 'Mike', 'pay': 80000}]

dict_comp2 = [{key: item[key]} for key in select_vals  for item in test_dict['data']  if item['pay'] > 65000 ]

The above line gets me [{'name': 'John'}, {'name': 'Mike'}, {'pay': 70000}, {'pay': 80000}]

How does the two o/ps vary when written in a for loop ? When I execute in a for loop

dict_comp3 = []
for key in select_vals:
    for item in test_dict['data']:
        if item['pay'] > 65000:
            dict_comp3.append({key: item[key]})

print(dict_comp3)

The above line gets me same as dict_comp2 [{'name': 'John'}, {'name': 'Mike'}, {'pay': 70000}, {'pay': 80000}]

How do I get the o/p as dict_comp1 in a for loop ?


Solution

  • The select vals iteration should be the inner one

    result = []
    for item in test_dict['data']:
        if item['pay'] > 65000:
            aux = {}
            for key in select_vals:
                aux[key] = item[key]
            result.append(aux)