Tengo una lista de diccionarios similar a la siguiente:

d = [{'first':'jason','color':'green','age':22},
     {'first':'josh','color':'red','age':22},
     {'first':'chris','color':'blue','age':21}
    ]

Quiero crear un diccionario que sea un subconjunto de los diccionarios anteriores.

Algo que se parece a:

newD = {'jason':22, 'josh':22, 'chris':21}

Lo siguiente hace el truco:

first = [k['first'] for k in d]
age = [k['age'] for k in d]
newD = dict(zip(first, age))

¿Pero hay una manera más pitónica / limpia de hacer esto?

2
jadki 8 sep. 2018 a las 01:08

4 respuestas

La mejor respuesta
newd = {dd['first']: dd['age'] for dd in d}

Salida:

In [3]: newd
Out[3]: {'chris': 21, 'jason': 22, 'josh': 22}
6
Osman Mamun 7 sep. 2018 a las 22:12

Utilizando operator.itemgetter:

from operator import itemgetter

res = dict(map(itemgetter('first', 'age'), d))

{'jason': 22, 'josh': 22, 'chris': 21}
1
jpp 7 sep. 2018 a las 22:12

Sí, solo necesitas una comprensión:

>>> {x['first']: x['age'] for x in d}
{'jason': 22, 'josh': 22, 'chris': 21}
3
wim 7 sep. 2018 a las 22:12

¿Tal vez esto?

newD = dict((x['first'], x['age']) for x in d)
3
0605002 7 sep. 2018 a las 22:12