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
Val: 77
Ha disminuido su posición en 2 puestos en Python (en relación al último mes)
Gráfica de Python

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