Python - Ordenar con sort por dos atributos

   
Vista:

Ordenar con sort por dos atributos

Publicado por alejandro (3 intervenciones) el 18/02/2014 10:49:02
Hola,tengo que ordenar por nombre y edad redefiniendo el método __cmp__, a la hora hora de ordenar es como lo tengo hecho hasta hora pero ala hora de ordenar por edad no se como hacerlo, dejo mi código.
saludos y gracias!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class Persona():
    def __init__(self ,nombre,edad):
        self.nombre = nombre
        self.edad =edad
 
    def __cmp__(self,persona) :
        if self.nombre < persona.nombre:
            rst = -1
        elif self.nombre > persona.nombre:
            rst = 1
        else:
            rst = 0
        return rst
 
obj1 = Persona("hola",12);
obj2 = Persona("Alex",1);
obj3 = Persona("Andrea",52);
obj4 = Persona("adios",13);
obj5 = Persona("Pepito",80);
obj6 = Persona("Alejandro",5);
 
lista = [obj1,obj2,obj3,obj4,obj5,obj6];
 
 
print "Ordenar por nombre"
lista.sort();
a=0
for persona in lista:
    print(lista[a].nombre,lista[a].edad)
    a=a+1
 
 
print ""
 
print "Ordenar por edad"
 
//No se como ordenar por edad
 
a=0
for persona in lista:
    print(lista[a].nombre,lista[a].edad)
    a=a+1
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve

Ordenar con sort por dos atributos

Publicado por xve (1229 intervenciones) el 18/02/2014 15:26:18
Hola Alejandro, tendria que ser algo así:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class Persona():
    def __init__(self ,nombre,edad):
        self.nombre = nombre
        self.edad =edad
 
    def cmpNombre(self,persona):
        if self.nombre < persona.nombre:
            rst = -1
        elif self.nombre > persona.nombre:
            rst = 1
        else:
            rst = 0
        return rst
 
    def cmpEdad(self,personas):
        if self.edad < persona.edad:
            rst = -1
        elif self.edad > persona.edad:
            rst = 1
        else:
            rst = 0
        return rst
 
obj1 = Persona("hola",12);
obj2 = Persona("Alex",1);
obj3 = Persona("Andrea",52);
obj4 = Persona("adios",13);
obj5 = Persona("Pepito",80);
obj6 = Persona("Alejandro",5);
 
lista = [obj1,obj2,obj3,obj4,obj5,obj6];
 
 
print "Ordenar por nombre"
lista.sort(cmp=Persona.cmpNombre)
for persona in lista:
    print(persona.nombre,persona.edad)
 
 
print ""
 
print "Ordenar por edad"
lista.sort(cmp=Persona.cmpEdad);
for persona in lista:
    print(persona.nombre,persona.edad)

Pero no me ordena correctamente por los números, y no se ver cual es el problema... haber si alguien nos puede informar...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ordenar con sort por dos atributos

Publicado por Alejandri (3 intervenciones) el 18/02/2014 23:02:22
he cambiado el orden,es decir primero intento ordenar por edad y después por nombre y me da un error, poniendo exactamente lo mismo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class Persona():
    def __init__(self ,nombre,edad):
        self.nombre = nombre
        self.edad =edad
 
 
 
    def cmpEdad(self,personas):
        if self.edad < persona.edad:
            rst = -1
        elif self.edad > persona.edad:
            rst = 1
        else:
            rst = 0
        return rst
 
    def cmpNombre(self,persona):
        if self.nombre < persona.nombre:
            rst = -1
        elif self.nombre > persona.nombre:
            rst = 1
        else:
            rst = 0
        return rst
 
obj1 = Persona("hola",12);
obj2 = Persona("Alex",1);
obj3 = Persona("Andrea",52);
obj4 = Persona("adios",13);
obj5 = Persona("Pepito",80);
obj6 = Persona("Alejandro",5);
 
lista = [obj1,obj2,obj3,obj4,obj5,obj6];
 
 
print "Ordenar por nombre"
lista.sort(cmp=Persona.cmpEdad)
for persona in lista:
    print(persona.nombre,persona.edad)
 
 
print ""
 
print "Ordenar por edad"
lista.sort(cmp=Persona.cmpNombre);
for persona in lista:
    print(persona.nombre,persona.edad)

----------------------------------------------------------------------------------------

1
2
3
4
5
6
Traceback (most recent call last):
  File "C:\Users\Alejandro\Desktop\sa.py", line 37, in <module>
    lista.sort(cmp=Persona.cmpEdad)
  File "C:\Users\Alejandro\Desktop\sa.py", line 9, in cmpEdad
    if self.edad < persona.edad:
NameError: global name 'persona' is not defined
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Ordenar con sort por dos atributos

Publicado por xve (1229 intervenciones) el 19/02/2014 09:46:45
Hola Alejandro, ya he dado con el error... gracias tu error, he visto donde estaba el problema.

Este código si funciona:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class Persona():
    def __init__(self ,nombre,edad):
        self.nombre = nombre
        self.edad =edad
 
    def cmpNombre(self,persona):
        if self.nombre < persona.nombre:
            rst = -1
        elif self.nombre > persona.nombre:
            rst = 1
        else:
            rst = 0
        return rst
 
    def cmpEdad(self,persona):
        if self.edad < persona.edad:
            rst = -1
        elif self.edad > persona.edad:
            rst = 1
        else:
            rst = 0
        return rst
 
obj1 = Persona("hola",12);
obj2 = Persona("Alex",1);
obj3 = Persona("Andrea",52);
obj4 = Persona("adios",13);
obj5 = Persona("Pepito",80);
obj6 = Persona("Alejandro",5);
 
lista = [obj1,obj2,obj3,obj4,obj5,obj6];
 
 
print "Ordenar por nombre"
lista.sort(cmp=Persona.cmpNombre)
for persona in lista:
    print(persona.nombre,persona.edad)
 
 
print ""
 
print "Ordenar por edad"
lista.sort(cmp=Persona.cmpEdad);
for persona in lista:
    print(persona.nombre,persona.edad)

Habia puesto esto:
1
def cmpEdad(self,personas):
y sobra la s de personas...;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ordenar con sort por dos atributos

Publicado por Alejandro (3 intervenciones) el 19/02/2014 10:57:33
Muchas gracias :)
no había caído en el error.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar