Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Jirp96 en 7 Agosto 2011, 18:26 pm



Título: [SOLUCIONADO][PYTHON] Como ordenar(sort) un diccionario?
Publicado por: Jirp96 en 7 Agosto 2011, 18:26 pm
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
  1. from string import letters
  2.  
  3. let = {}
  4. for x in letters[26:52]: #letters[26:52] es la parte que contiene las letras minusculas
  5.    let[x] = ord(x)
  6.  
  7. del letters

Cuando lo genero, me queda asi:
Código
  1. >>>let
  2. {'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 (http://code.activestate.com/recipes/52306/))

Código
  1. def sortedDictValues1(adict):
  2.    items = adict.items()
  3.    items.sort()
  4.    return [value for key, value in items]
  5.  

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
  1. >>>l = sortedDictValues1(let)
  2. >>>for i in l:
  3. x[chr(i)] = i
  4.  
  5. >>>x
  6. {'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}
  7.  

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


Título: Re: [PYTHON] Como ordenar(sort) un diccionario?
Publicado por: Novlucker en 7 Agosto 2011, 20:10 pm
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
  1. print ord("a")
  2. print chr(97)

Saludos


Título: Re: [PYTHON] Como ordenar(sort) un diccionario?
Publicado por: Jirp96 en 7 Agosto 2011, 21:06 pm
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!


Título: Re: [PYTHON] Como ordenar(sort) un diccionario?
Publicado por: Novlucker en 7 Agosto 2011, 21:11 pm
Pero eso lo puedes hacer con comparaciones a secas :P
Código
  1. print "a">"b"
  2. print "c"<"z"
Por lo cual puedes convertir a enteros con ORD, y luego verificar si es mayor a "z" con CHR

Saludos


Título: Re: [PYTHON] Como ordenar(sort) un diccionario?
Publicado por: Jirp96 en 7 Agosto 2011, 21:16 pm
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


Título: Re: [SOLUCIONADO][PYTHON] Como ordenar(sort) un diccionario?
Publicado por: cerototal en 10 Junio 2016, 17:35 pm
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.