Ordenar lista que tiene elementos clase

damufo damufo en gmail.com
Jue Jul 3 20:19:10 CEST 2008


Arnau Sanchez escribiu:
> Alexis Roda escribió:
> 
>>> persona1 = Persona("nombre1", "18", "M")
>>> persona2 = Persona("nombre2", "19", "F")
>>
>> Puedes utilizar el método sort() de las listas. Ten presente que este 
>> método ordena la lista in situ, *no* devuelve una copia ordenada de la 
>> lista.
> 
> Y si no lo quieres in situ puedes usar el built-in "sorted".
> 
>> def compara_edad_sexo_nombre(p1, p2) :
>>     return cmp((p1.edad, p1.sexo, p1.nombre),
>>                (p2.edad, p2.sexo, p2.nombre))
> 
> Una alternativa a pasar una función de comparación (parámetro "cmp"), es 
> indicar cómo obtener los valores para realizar dicha comparación 
> (parámetro "key"):
> 
> personas = [persona1, persona2]
> key = lambda persona: [persona.edad, persona.sexo, persona.nombre]
> sorted(personas, key=key)
esto es interesante.
> 
> Lo mismo con operator.attrgetter queda:
> 
> import operator
> personas = [persona1, persona2]
> key = lambda persona: operator.attrgetter("edad", "sexo", "nombre")
> sorted(personas, key=key)
> 
> ---
> 
> Pero como ya te han comentado, si estos objetos son el resultado de una 
> búsqueda en un ORM, puedes pedirle que te los dé ya ordenados por el 
> criterio que necesites, lo hará más rápido.
> 
> arnau
> 

Estoy comenzando a programar con objetos, el caso es que aun no tengo
claro que es lo que tengo que tener cargado en el objeto o lo que es mejor.

Para este caso lo que puedo hacer es una busqueda en la base de datos y 
que devuelva el resultado con el orden que quiero.
La otra opción, la que pretendía, era que al cargar el objeto, en este 
caso grupo, le cargaría tambien las personas... y todos los datos que le 
perteneciesen así no tendría que consultar de nuevo la base de datos 
(decir que es una aplicación de escritoio esto no debería ser muy 
pesado). Despues en diferentes momentos cargaré los datos del grupo en 
un formulario, entre ellos los de personas los pondré en una tabla (o 
lista), pues bien, en este momento és cuando tengo que ordenarlos para 
al ponerlos en la lista estean en el orden deseado.

Como decía, y ya me estoy extendiendo, la otra opción es que en lugar de 
que grupo tenga personas cargado con todos sus datos, pues hacer que 
grupo tenga una (o mas) función que devuelva los datos que pido

sería


class Grupo()
     def __init__(grupo, lugar="", centro="", personas=[]):
         self.grupo = grupo
	self.lugar = lugar
         self.centro = centro
         self.personas = personas
     def personas_nombre():
	conexión con base de datos
	rs = lanzar consulta "select nombre, edad, sexo from personas
		where grupo=%s order by nombre, edad, sexo" % self.grupo
  	return rs

donde rs sería un cursor (tupla) según la dbapi, con los campos nombre 
edad seso

grupo1 = Grupo("001", "coruña", "centro1")

lo bueno de esta segunda opción es que podría hacer diferentes funciones 
para diferenes ordenaciones por ejemplo

     def personas_ordenado_por_sexo():
	conexión con base de datos
	rs = lanzar consulta "select nombre, edad, sexo from personas
		where grupo=%s order by sexo, nombre " % self.grupo
  	return rs


No tengo ni idea de que es lo mas adecuado, no se si es cuestión de 
gustos o depende de la situación, o lo que planteo es una tontería.
En fin... cuanto mas aprendo de programación mas me da la sensación de 
que hai aun más por aprender.

Me estoy dando cuenta de que incluso la opción de devolver diferentes 
ordenados se puede hacer a partir de los datos almacenados en personas 
(me refiero a la primera opción, la de cagar todo en la clase), y hacer 
funcinones que devuelvan el tema ordenado como quiera usando por ejemplo

     def personas_ordenado_por_sexo():
	#personas = [persona1, persona2] # esto sería self.personas
	key = lambda persona: [persona.sexo, persona.nombre]
	return sorted(self.personas, key=key)


Gracias Arnau.
------------ próxima parte ------------
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes


Más información sobre la lista de distribución Python-es