Python - Python metodo de ordenamiento, segun mas de un parametro parametros

   
Vista:
Imágen de perfil de equipo_de_gnc_

Python metodo de ordenamiento, segun mas de un parametro parametros

Publicado por equipo_de_gnc_ (4 intervenciones) el 13/08/2016 05:06:29
Holaa

no estoy bajo ningun concepto pudiendo resorver el siguiente ejercicio:

Modificar el método cmp de Hotel para poder ordenar de menor a mayor las listas de hoteles según el criterio: primero por ubicación, en orden alfabético y dentro de cada ubicación por la relación calidad-precio.

o sea, si entiendo bien, si dos hoteles se llaman igual , ordenar segun calidad precio (de ratio). Como lograria esto? Agradezco infinitamente cualquier respuesta orientativa al menos ya que carezco de algunos conocimientos, e intente algunas maneras, y no logro sacarlo.. puede que no este entendiendo bien/ o no este del todo bien expresado el enunciado del ejercicio? (de aca: https://librosweb.es/libro/algoritmos_python/capitulo_14/ejercicios_14.html)

Muchas gracias!!


el codigo es el siguiente ----->



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
48
49
50
51
52
53
54
55
56
57
58
def es_numero(valor): return isinstance(valor, (int, float, long, complex) )
 
def es_cadena_no_vacia (valor): return isinstance (valor, (str))
 
class Hotel(object): def init(self, nombre = '', ubicacion = '', puntaje = 0, precio = float("inf")):
 
def __init__ (self, nombre = '*', ubicacion = '*',
             puntaje = 0, precio = float("inf")):
 
 
    if es_cadena_no_vacia (nombre):
        self.nombre = nombre
    else:
        raise TypeError ("El nombre debe ser una cadena no vacía")
 
    if es_cadena_no_vacia (ubicacion):
        self.ubicacion = ubicacion
    else:
        raise TypeError ("La ubicación debe ser una cadena no vacía")
 
    if es_numero(puntaje):
        self.puntaje = puntaje
    else:
        raise TypeError ("El puntaje debe ser un número")
 
    if es_numero(precio):
        if precio != 0:
            self.precio = precio
        else:
            self.precio = float("inf")
    else:
        raise TypeError("El precio debe ser un número")
 
def __str__(self):
    """ Muestra el hotel según lo requerido. """
    return self.nombre + " de "+ self.ubicacion+ \
            " - Puntaje: "+ str(self.puntaje) + " - Precio: "+ \
            str(self.precio)+ " pesos."
 
def ratio (self):
    """ Calcula la relación calidad-precio de un hotel de acuerdo a la fórmula que nos dio el cliente. """
    return ((self.puntaje**2)*10.)/self.precio
 
h1 = Hotel("Hotel Guadalajara", "Pinamar", 1, 35)
 
h2 = Hotel("Hostería París", "Aosario", 1, 35)
 
h3 = Hotel("Apart-Hotel Estocolmo", "Esquel", 3, 105)
 
h4 = Hotel("Posada El Cairo", "Salta", 2.5, 15)
 
lista = [ h1, h2, h3, h4 ]
 
lista.sort()
 
for Hotel in lista:
 
print Hotel
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 Jorge De Los Santos

Python metodo de ordenamiento, segun mas de un parametro parametros

Publicado por Jorge De Los Santos (54 intervenciones) el 13/08/2016 07:57:49
Prueba con lo siguiente, creo que debe funcionar:


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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
def es_numero(valor): return isinstance(valor, (int, float, long, complex) )
 
def es_cadena_no_vacia (valor): return isinstance (valor, (str))
 
class Hotel(object):
    """ Hotel: sus atributos son: nombre, ubicacion, puntaje y precio."""
 
    def __init__(self, nombre = '*', ubicacion = '*',
                 puntaje = 0, precio = float("inf")):
        """ nombre y ubicacion deben ser cadenas no vacías,
            puntaje y precio son números.
            Si el precio es 0 se reemplaza por infinito. """
 
        if es_cadena_no_vacia (nombre):
            self.nombre = nombre
        else:
            raise TypeError ("El nombre debe ser una cadena no vacía")
 
        if es_cadena_no_vacia (ubicacion):
            self.ubicacion = ubicacion
        else:
            raise TypeError ("La ubicación debe ser una cadena no vacía")
 
        if es_numero(puntaje):
            self.puntaje = puntaje
        else:
            raise TypeError ("El puntaje debe ser un número")
 
        if es_numero(precio):
            if precio != 0:
                self.precio = precio
            else:
                self.precio = float("inf")
        else:
            raise TypeError("El precio debe ser un número")
 
    def __str__(self):
        """ Muestra el hotel según lo requerido. """
        return self.nombre + " de "+ self.ubicacion+ \
                " - Puntaje: "+ str(self.puntaje) + " - Precio: "+ \
                str(self.precio)+ " pesos."
 
    def ratio(self):
        """Calcula la relación calidad-precio de un hotel de acuerdo
        a la fórmula que nos dio el cliente. """
        return ((self.puntaje**2)*10.)/self.precio
 
 
    def __cmp__(self, otro):
        _ls = sorted([self.ubicacion, otro.ubicacion])
        if _ls[0] is self.ubicacion:
            if self.ubicacion == otro.ubicacion:
                return self.comparar_por_ratio(otro)
            else:
                return -1
        else:
            if self.ubicacion == otro.ubicacion:
                return self.comparar_por_ratio(otro)
            else:
                return 1
 
    def comparar_por_ratio(self,otro):
        diff = self.ratio() - otro.ratio()
        if diff > 0: return 1
        elif diff < 0: return -1
        else: return 0
 
 
if __name__=='__main__':
    h1 = Hotel("Hotel Guadalajara", "Pinamar", 1, 35)
    h2 = Hotel("Hostería París", "Aosario", 1, 35)
    h3 = Hotel("Apart-Hotel Estocolmo", "Esquel", 3, 105)
    h4 = Hotel("Posada El Cairo", "Salta", 2.5, 15)
    lista = [ h1, h2, h3, h4 ]
    lista.sort()
    for h in lista:
        print h, h.ratio()
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de equipo_de_gnc

Python metodo de ordenamiento, segun mas de un parametro parametros

Publicado por equipo_de_gnc (4 intervenciones) el 13/08/2016 23:51:19
gracias funciono!
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 delfina

Python metodo de ordenamiento, segun mas de un parametro parametros

Publicado por delfina (4 intervenciones) el 14/08/2016 22:54:10
Hola! Mira, por un momento pense que si pero me doy cuenta que no funciona, la lista no se imprime ordenada por orden alfabetico, quizas agregandole un parametro a sort?
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