Search code examples
pythonlistdictionarylist-comprehensiondictionary-comprehension

Combine dict comprehension with list comprehension to merge dict pairs


Given dictionary 'countries':

countries = [
{'country': 'Aruba', 'iso3': 'ABW'},
{'country': 'Afghanistan', 'iso3': 'AFG'},
{'country': 'Angola', 'iso3': 'AGO'}, 
{'country': 'Anguilla', 'iso3': 'AIA'},
{'country': 'Albania', 'iso3': 'ALB'},
{'country': 'Andorra', 'iso3': 'AND'}, 
{'country': 'United Arab Emirates', 'iso3': 'ARE'}, 
{'country': 'Argentina', 'iso3': 'ARG'}, 
{'country': 'Armenia', 'iso3': 'ARM'}, 
{'country': 'American Samoa', 'iso3': 'ASM'}
]

I want to have iso3 value as a key and country value as a value. Desired output:

[
{'ABW': 'Aruba'}, 
{'AFG': 'Afghanistan'}, 
{'AGO': 'Angola'}, 
{'AIA': 'Anguilla'}, 
{'ALB': 'Albania'}, 
{'AND': 'Andorra'}, 
{'ARE': 'United Arab Emirates'}, 
{'ARG': 'Argentina'}, 
{'ARM': 'Armenia'}, 
{'ASM': 'American Samoa'}
]

I have achieved it with:

iso3_map = []
for country in countries:
    data = {
        country['iso3']: country['country']
    }
    iso3_map.append(data)

But im wondering how to do it more elegant way in a list comprehension. I tried some ways, the closest I got was:

[{v if k == 'iso3' else None: v if k == 'country' else None for k, v in country.items()} for country in countries]

But doesnt return desired output


Solution

  • This should give you your desired output.

    [{country['iso3']: country['country']} for country in countries]