[pyar] Diccionarios *ordenados*

Martin Cerdeira martincerdeira en gmail.com
Mie Nov 17 23:30:57 ART 2010


2010/11/9 Martin Cerdeira <martincerdeira en gmail.com>:
> Sé que los diccionarios no están ordenados, pero, hay alguna forma de
> hacer algo así??
>
> dicci = {"nomb":"arla", "bomb":"zapa"}
>
> sortebyKey(dicci)
>
> "zapa"  < porque su key, empieza con b, va primero
> "arla"  < porque su key empieza con n, va segundo
>
> y
>
> sortebyVal(dicci)
>
> "arla"  < porque su valor empieza con a, va primero
> "zapa"  < porque su valor, empieza con z, va segundo
>
> Hay algo así hecho? O tendría que inventar algo yo? (es para evitar la
> fatiga, como diría Jaimito)
>
> En si, lo necesito para algo más complejo[0], pero, creo que con esto
> tendría para arrancar.
>
> Saludos
>
> [0] Lo más complejo, por si alguno tiene curiosidad, es un diccionario así:
>
> dicci = {"key1":obj1, "key2":obj2}
>
> Siendo, obj 1 y 2, instancias de una clase, que guardan una relación
> con su key, por ejemplo, si objeto tiene:
>
> obj.name
> obj.order
>
> Tendría:
>
> dicci["key1"].name = "key1"
> dicci["key1"].order = 1
>
> dicci["key2"].name = "key2"
> dicci["key2"].order = 2
>
> Yo, esta estructura ya la tengo así, lo que me gustaría sería poder
> recorrer los elementos, ordenador por obj<n>.<propiedad> (en este
> caso, por name o por order)

Gracias a todos por las respuestas. Finalmente, lo resolvi de otra
forma dada la estructura que tenia (no se me ocurrio pero, seguramente
debe haber una mejor manera)

Tiene que ver con mi proyecto, codmacs, basicamente yo tengo un diccionario as'i
Suponiendo que la tabla sea:

Articulos
codi    varchar(10)
nomb  varchar(50)
prec    float

Me arma:

{"codi": <CMCore.codfields_obj>, "nomb": <CMCore.codfields_obj>,
"prec": <CMCore.codfields_obj>}

Cada CMCore.codfields_obj es una instancia de una clase que tiene los
atributos, Index, Indentifier, IPKey, IsPkey, Format, etc que
representan los atributos de los campos de la tabla que se esté
usando.
Entonces, para mostrar el nombre de los campos, por ejemplo, dentro de
un template, yo puedo poner:

for n in table.cols:
    print table[n].Identifier

Pero, que pasaba? Como es un diccionario, eso muestra los campos de la
tabla, pero, no necesariamente en el orden que estén en la tabla. Por
lo que, necesitaba ordenarlos, pero, no era por los values(). Era casi
por los keys(). Por qué digo casi? porque, en realidad, me tenía que
fijar de cada value, que era un objeto, su atributo .Index.

Cómo lo resolví? Con una clase Csorted que usa yield (sobrecargando __iter__)

http://code.google.com/p/codmacs/source/browse/src/CodMACs.py

Entonces, en el template, uno puedo usar:

stabl = Csorted(table.cols)

for n in stabl:
    print n.Identifier

Y ahi si, salen ordenaditos por Index =)

A todo esto, y si alguien llegó hasta acá. Se les ocurre una mejor??
(seguro que si)

Saludos!!
-------------------------------------
Martín Cerdeira - Software Developer
[web] http://www.codmacs.blogspot.com/
()  ascii ribbon campaign
/\  www.asciiribbon.org



More information about the pyar mailing list