tutorial sets realpython real python

sets - real python tutorial



¿Cómo combino una lista de dicts en un solo dict? (9)

¿Cómo puedo convertir una lista de dictados como este?

[{''a'':1}, {''b'':2}, {''c'':1}, {''d'':2}]

En un solo dict como este

{''a'':1, ''b'':2, ''c'':1, ''d'':2}



Esto es similar a @delnan, pero ofrece la opción de modificar los elementos k / v (clave / valor) y creo que es más legible:

new_dict = {k:v for list_item in list_of_dicts for (k,v) in list_item.items()}

por ejemplo, reemplace k / v elems de la siguiente manera:

new_dict = {str(k).replace(" ","_"):v for list_item in list_of_dicts for (k,v) in list_item.items()}

desempaqueta la tupla k, v del generador de diccionarios .items () después de sacar el objeto dict de la lista


Esto funciona para diccionarios de cualquier longitud:

>>> result = {} >>> for d in L: ... result.update(d) ... >>> result {''a'':1,''c'':2,''b'':1,''d'':2}

Y como generador-oneliner:

dict(pair for d in L for pair in d.items())

En Python 2.7 y 3.x esto puede y debe escribirse como comprensión dict (gracias, @katrielalex):

{ k: v for d in L for k, v in d.items() }


Para diccionarios planos, puede hacer esto:

from functools import reduce reduce(lambda a, b: dict(a, **b), list_of_dicts)


Puede usar la función de join desde la biblioteca funcy :

from funcy import join join(list_of_dicts)


dic1 = {''Maria'': 12, ''Paco'': 22, ''Jose'': 23} dic2 = {''Patricia'': 25, ''Marcos'': 22 ''Tomas'': 36}

dic2 = dict (dic1.items () + dic2.items ())

y este será el resultado:

dic2 {''Jose'': 23, ''Marcos'': 22, ''Patricia'': 25, ''Tomas'': 36, ''Paco'': 22, ''Maria'': 12}


>>> L=[{''a'': 1}, {''b'': 2}, {''c'': 1}, {''d'': 2}] >>> dict(i.items()[0] for i in L) {''a'': 1, ''c'': 1, ''b'': 2, ''d'': 2}

Nota: el orden de ''b'' y ''c'' no coincide con su salida porque los dicts están desordenados

si los dicts pueden tener más de una clave / valor

>>> dict(j for i in L for j in i.items())


>>> dictlist = [{''a'':1},{''b'':2},{''c'':1},{''d'':2, ''e'':3}] >>> dict(kv for d in dictlist for kv in d.iteritems()) {''a'': 1, ''c'': 1, ''b'': 2, ''e'': 3, ''d'': 2} >>>

Nota Agregué un segundo par de clave / valor al último diccionario para mostrar que funciona con múltiples entradas. También las claves de los dictados posteriores en la lista sobrescribirán la misma clave de un dictado anterior.


dict1.update( dict2 )

Esto es asimétrico porque debe elegir qué hacer con las claves duplicadas; en este caso, dict2 sobrescribirá dict1 . Cambiarlos por el otro camino.

EDITAR: Ah, lo siento, no vi eso.

Es posible hacer esto en una sola expresión:

>>> from itertools import chain >>> dict( chain( *map( dict.items, theDicts ) ) ) {''a'': 1, ''c'': 1, ''b'': 2, ''d'': 2}

¡Sin crédito para mí por esto último!

Sin embargo, yo diría que podría ser más Pythonic (explícito> implícito, plano> anidado) para hacer esto con un bucle for simple. YMMV.