Python nested dict comprensión

¿Alguien puede explicar cómo hacer dictados nesteds?

>> 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!

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

Puede simplificar esto en 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} >>> 
 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)} 

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

 >>> [w for w in (((x+y,0) for x in 'cd') for y in 'ab')] [ at 0x1ca5d70>,  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 obtuviste dos valores-clave de pares de tuplas.

¿Por qué 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 superiores, puedes usar las comprensiones de dict

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