Comprensión de dictado anidado de Python

¿Alguien puede explicar cómo hacer comprensiones de dictados anidados?

>> j = dict(((x+y,0) for x in 'cd') for y in 'ab')
>> {('ca', 0): ('da', 0), ('cb', 0): ('db', 0)}

Me hubiera gustado:

>> j
>> {'ca':0, 'cb':0, 'da':0, 'db':0}

¡Gracias!

preguntado el 09 de enero de 11 a las 11:01

4 Respuestas

dict((x+y,0) for x in 'cd' for y in 'ab')

Respondido el 09 de enero de 11 a las 14:01

Genial, me alegro de que esto se pueda simplificar. - atp

Puede simplificar esto a un solo bucle utilizando el producto cartesiano de itertools

>>> from itertools import product
>>> j=dict((x+y,0) for x,y in product('cd','ab'))
>>> j
{'cb': 0, 'ca': 0, 'db': 0, 'da': 0}
>>> 

Respondido el 09 de enero de 11 a las 15:01

dict((x+2*y, 0) for x in range(1,4,2) for y in range(15, 18, 2))

Por cierto, lo que llamamos comprensión de dict es algo como lo siguiente que solo está disponible en Python2.7 +:

{x+2*y:0 for x in range(1,4,2) for y in range(15, 18, 2)}

Respondido el 09 de enero de 11 a las 14:01

Los paréntesis adicionales en la pregunta introducen otra expresión generadora que produce 2 generadores, cada uno de los cuales produce 2 tuplas. La siguiente lista de comprensión muestra exactamente lo que está sucediendo.

>>> [w for w in (((x+y,0) for x in 'cd') for y in 'ab')]
[<generator object <genexpr> at 0x1ca5d70>, <generator object <genexpr> at 0x1ca5b90>]

Una lista de comprensión en lugar de la expresión del generador muestra lo que contienen los generadores anteriores

>>> [w for w in ([(x+y,0) for x in 'cd'] for y in 'ab')]
[[('ca', 0), ('da', 0)], [('cb', 0), ('db', 0)]]

Y es por eso que obtenía dos pares de tuplas clave-valor.

Por que funciona la respuesta de mouad

>>> [w for w in ((x+y,0) for x in 'cd' for y in 'ab')]
[('ca', 0), ('cb', 0), ('da', 0), ('db', 0)]

En Python 2.7 y 3.0 y superior, puede usar dict comprehensions

>>> j = {x+y:0 for x in 'cd' for y in 'ab'}
>>> j
{'cb': 0, 'ca': 0, 'db': 0, 'da': 0}

Respondido el 09 de enero de 12 a las 20:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.