Generador de diccionario en Python

Iniciado por PUAROT, 2 Abril 2017, 00:09 AM

0 Miembros y 1 Visitante están viendo este tema.

PUAROT

he visto que se pueden crear diccionarios con expresiones generadoras, y me he puesto a practicar :-P
El caso es que me he propuesto crear un diccionario con los valores del 1 al 100 donde la clave sea un numero impar y el valor el par. {1:2,3:4....}

he intentado crear una expresion generadora por si sola y no he sido capaz, lo mas cerca que he estado es :
Código (python) [Seleccionar]
c = {x:y for x in range(30) if x % 2 != 0 for y in range(30) if y % 2 == 0}

pero el resultado no es el esperado por mi
por lo que he pensado en hacer un generador para los numeros pares y otro para los impares :
Código (python) [Seleccionar]
a = (i for i in range(100) if i % 2 == 0)

b = (i for i in range(100) if i % 2 != 0)

y después crear el diccionario con un bucle for :
Código (python) [Seleccionar]
for i in a:
for j in b:
c[i] = j

pero el resultado tampoco es el esperado por mi y me doy cuenta de que no es la logica correcta, así que intento :
Código (python) [Seleccionar]
for x in a, y in b:
c[x] = y

Estoy seguro de que es mucho mas facil de lo que yo estoy intentando, pero no encuentro la forma adecuada.
En que estoy fallando ?

PUAROT

He encontrado la forma de hacerlo, creo que es un poco chapucera, ya que estoy seguro que hay una forma mejor de hacerlo, pero...

Código (python) [Seleccionar]
a = (i for i in range(100) if i % 2 == 0)
b = (i for i in range(100) if i % 2 != 0)
c = {}
for x in a:
    c[x]=next(b)

tincopasan

#2
la verdad no se bien cual es el planteo general, pero una forma de obtener ese resultado en una línea:
Código (python) [Seleccionar]
c = {x:x+1 for x in range(100) if x %2 != 0 }

PUAROT

Gracias por contestar, no había caído en hacerlo así.

El planteamiento es poder crear un diccionario con una condición para el key y otra para el value por ejemplo en el key los pares y el otro los múltiplos de tres


tincopasan

Citar
Publicado por: PUAROT
He encontrado la forma de hacerlo, creo que es un poco chapucera, ya que estoy seguro que hay una forma mejor de hacerlo, pero...

Código

    a = (i for i in range(100) if i % 2 == 0)
    b = (i for i in range(100) if i % 2 != 0)
    c = {}
    for x in a:
        c
  • =next(b)
una de las cosas que me gusta de python es que te permite resolver un planteo de muchas formas, te muestro otra con respecto a tu código:
Código (python) [Seleccionar]

a = (i for i in range(100) if i % 2 == 0)
b = (i for i in range(100) if i % 2 != 0)
c = {a:b for a,b in zip(a,b)}

 

PUAROT

 ;-) ;-) ;-) ;-)

El zip es lo que me faltaba...

voy a buscar que usos tiene y como se usa, que no lo he usado nunca y no lo controlo

Muchas gracias !!!

Once

Hola chicos, sé que ya está resuelta la duda, pero hay una forma más fácil de hacer, teniendo en cuenta que los números pares están dados por la expresion: 2n y los impares por 2n+1:

Código (python) [Seleccionar]
{2*x: 2*x+1 for x in range(100)}

Saludos!

PUAROT

Muchas gracias !!!
Como bien se dice por aquí, no hay una sola forma de hacer las cosas :-)

Me ha gustado la forma de plantear el problema!!
Sabia yo que era mucho mas facil de lo que parecia :P