[SOLUCIONADO][PYTHON] Como ordenar(sort) un diccionario?

Iniciado por Jirp96, 7 Agosto 2011, 18:26 PM

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

Jirp96

Hola!
Como dice el titulo, necesito ordenar("sortear"?) un diccionario.
Tengo un diccionario que contiene las letras del alfabeto en minuscula y sus valores ascii; el par "clave-valor" seria: (letra: CodAscii)

El diccionario lo defino de esta forma(para no anotar letra por letra :xD):

Código (python) [Seleccionar]
from string import letters

let = {}
for x in letters[26:52]: #letters[26:52] es la parte que contiene las letras minusculas
   let[x] = ord(x)
   
del letters


Cuando lo genero, me queda asi:
Código (python) [Seleccionar]
>>>let
{'a': 97, 'c': 99, 'b': 98, 'e': 101, 'd': 100, 'g': 103, 'f': 102, 'i': 105, 'h': 104, 'k': 107, 'j': 106, 'm': 109, 'l': 108, 'o': 111, 'n': 110, 'q': 113, 'p': 112, 's': 115, 'r': 114, 'u': 117, 't': 116, 'w': 119, 'v': 118, 'y': 121, 'x': 120, 'z': 122}


Yo lo que quiero es que quede todo el diccionario ordenado(a,b,c,d,e,f....v,w,x,y,z) en vez de tenerlo asi(a,c,b,e,d....w,v,y,x,z)

___________________________________________________________________

He buscado en gugol, y encontre este codigo(lo encontre aqui)

Código (python) [Seleccionar]
def sortedDictValues1(adict):
   items = adict.items()
   items.sort()
   return [value for key, value in items]


y me genera una lista ordenada, hasta aca todo bien(la lista esta ordenada), pero luego si la convierto a diccionario(perdonen el nombre de las variables  :rolleyes:)
Código (python) [Seleccionar]
>>>l = sortedDictValues1(let)
>>>for i in l:
x[chr(i)] = i

>>>x
{'a': 97, 'c': 99, 'b': 98, 'e': 101, 'd': 100, 'g': 103, 'f': 102, 'i': 105, 'h': 104, 'k': 107, 'j': 106, 'm': 109, 'l': 108, 'o': 111, 'n': 110, 'q': 113, 'p': 112, 's': 115, 'r': 114, 'u': 117, 't': 116, 'w': 119, 'v': 118, 'y': 121, 'x': 120, 'z': 122}


Alguien sabe porque pasa esto? y si hay alguna cosa que estoy haciendo mal, o es algo de python(uso Python 2.66 por las dudas)?

Saludos! y gracias por adelantado

Novlucker

#1
El problema es que no es posible ordenar un diccionario, lo único que puedes hacer es imprimir u obtener una representación de como quedaría ordenado, pero el objeto en si no se puede ordenar.
Por cierto, no se lo que intentas hacer pero, no es mejor esto?
Código (python) [Seleccionar]
print ord("a")
print chr(97)


Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Jirp96

Hola!
Gracias por responder Novlucker, si no se puede, no se puede xD
_______________________________________________________________________

Por cierto, lo que intentaba hacer con ese diccionario era implementar el Cifrado Cesar en Python :xD.
El diccionario lo usaba para controlar los "límites" de los caracteres, para que no tomara ningun valor fuera del rango "a-z"

Saludos!

Novlucker

Pero eso lo puedes hacer con comparaciones a secas :P
Código (python) [Seleccionar]
print "a">"b"
print "c"<"z"

Por lo cual puedes convertir a enteros con ORD, y luego verificar si es mayor a "z" con CHR

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Jirp96

Es cierto, no lo había pensado de esa forma :xD
La duda ya esta resuelta, ya pueden cerrar si quieren :D
Saludos! y gracias de vuelta por responder =P

cerototal

hola, veo que este hilo es antiguo pero he llegado a él consultando la misma duda en algún buscador famoso.

También he dado con un hilo más moderno de otro foro, que resuelve así:

import operator
miDic={"a":2, "b":3, "d":1, "c":1}
resultado = sorted(miDic.items(), key=operator.itemgetter(0))
print resultado

[('a', 2), ('b', 3), ('c', 1), ('d', 1)]

El caso es que devuelve el resultado como lista (si no lo entiendo mal). Me pregunto si habría manera de que devolviera un nuevo diccionario.