Invertir claves de un diccionario por comprensión en python.

Iniciado por jam man, 22 Septiembre 2015, 05:49 AM

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

jam man

Hola. Como indico en el titulo, estoy haciendo un diccionario por comprensión, este es mi código.

Código (python) [Seleccionar]
abc = dict([(x, (x+5)**2) for x in range(1,28)])
print abc


y pues quiero que en vez de que las claves sean números que sean las letras del abecedario, por eso el rango de 1 hasta 28, y una vez reemplazada la clave agregar dos ceros al valor de cada clave es decir, si el valor es "36", quedaría como "0036" y si el valor tiene tres números ya solo se le agregaría un cero, ej: "961", seria "0961", y  se el valor ya cuenta con 4 dígitos o números no se agrega nada.

tincopasan

#1
no entendí nada! lo único que creo entender es lo de los 0, quizá deberías sacar el largo de la cadena(clave según vos) y si es menor a 4, pues agregar los 0 necesarios para que cumpla ese requisito.

edito: supongo que queres hacer todo en una línea, bueno puede ser también algo como esto:
Código (python) [Seleccionar]
abc = dict([(x, (str((x+5)**2)).zfill(4)) for x in range(1,28)])
print (abc)

Eleкtro

#2
Cita de: jam man en 22 Septiembre 2015, 05:49 AMpor eso el rango de 1 hasta 28

El abecedario Inglés se compone de 26 letras, mientras que el Español de 27, así que viendo tu búcle asumiré que intentas incluir la "Ñ", por ende, omitiré sugerirte soluciones que serían más simples si tu intención fuese utilizar el abecedario Inglés, haciendo uso de la función Zip.
https://docs.python.org/2/library/functions.html#zip

Para el primer problema, puedes declarar un set de caraceres, y para el segundo problema, puedes usar la función string.zfill() aka zerofill.
https://docs.python.org/2/library/string.html#string.zfill

Aquí tienes un ejemplo:
Código (python) [Seleccionar]
# -*- coding: Windows-1252 -*-

charSet = 'a b c d e f g h i j k l m n \xf1 o q r s t u v w x y z'.split()

keyValuePairs = [
    ((charSet[value]), str((value+5)**2).zfill(4))
    for value in range(0, len(charSet))   
]

for (key, value) in keyValuePairs:
   print key, value



Resultado de ejecución:
Citara 0025
b 0036
c 0049
d 0064
e 0081
f 0100
g 0121
h 0144
i 0169
j 0196
k 0225
l 0256
m 0289
n 0324
ñ 0361
o 0400
q 0441
r 0484
s 0529
t 0576
u 0625
v 0676
w 0729
x 0784
y 0841
z 0900

Saludos








jam man

Muchas gracias por sus comentarios, me ha servido bastante, muchas gracias. Lo que no me expliqué bien fue lo de cambiar las claves que son números por letras del abecedario.

Al ejecutar el código que tenía me salía esto.

Código (python) [Seleccionar]
{1:36, 2:49, .... 27:1024}

pero como el usuario tiene que introducir cualquier frase para hacer un tipo cifrado se tendría que cambiar la clave o key y quedaría así:

Código (python) [Seleccionar]
{a:36, 2:49, ... z:1024}

eso es lo que tiene que hacer el programa.

explorer

#4
Con la función chr() puedes convertir un entero en un carácter cuyo código ASCII es el indicado por el entero.

https://docs.python.org/2/library/functions.html#chr

Y para poner los '0' delanteros, se puede usar format (%)

https://docs.python.org/2/library/stdtypes.html#string-formatting-operations

Sería algo así:
Código (python) [Seleccionar]
print dict([ (chr(x), '%04d' % (x-ord('a')+6)**2) for x in range(ord('a'), ord('z')+1) ])
Sale:

{'a': '0036', 'c': '0064', 'b': '0049', 'e': '0100', 'd': '0081', 'g': '0144', 'f': '0121', 'i': '0196', 'h': '0169', 'k': '0256', 'j': '0225', 'm': '0324', 'l': '0289', 'o': '0400', 'n': '0361', 'q': '0484', 'p': '0441', 's': '0576', 'r': '0529', 'u': '0676', 't': '0625', 'w': '0784', 'v': '0729', 'y': '0900', 'x': '0841', 'z': '0961'}

En Perl quedaría casi igual (pero más corto, claro):
Código (perl) [Seleccionar]
%codigo = map { $_ => sprintf "%04d", (ord($_)-ord("a")+6)**2 } "a".."z"

jam man

Y como hago para que busca alguna palabra especifica? por ejemplo si ingreso solo la letra A, que me imprima su valor que es 0036, y cuando sea una frase?