Python - Error que no localizo

 
Vista:

Error que no localizo

Publicado por Raquel (12 intervenciones) el 03/11/2017 09:55:11
hola, tengo un problema y es que he realizado un ejercicio que consiste en programar el cálculo del punto de silla de una matriz (el enunciado concreto se muestra a continuación) pero al probar los ejemplos en las matrices en las que sí hay puntos de silla en lugar de devolverlos me devuelve siempre False. Adjunto el código ya que no sé donde puede estar el error.
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
43
44
# EJERCICIO 12
# ------------
#
# 
# Decimos que el elemento a_ij de una matriz cuadrada A es un punto de silla
# si es el máximo de los elementos de la fila i y el mínimo de los elementos
# de la columna j.  Es posible probar que una matriz cuyos elementos son
# todos distintos tiene a lo sumo un único punto de silla.  
# Definir una función silla que recibiendo como entrada una matriz A
# (representada mediante la lista de sus filas) con números distintos, 
# devuelva la tupla (i, j) tal que el elemento a_ij es un punto de silla de
# A. Devolver False si la matriz no tiene puntos de silla. 
 
# Ejemplos:
 
# >>> punto_de_silla([[1,2,3],[4,5,6],[7,8,9]])
# (0, 2)
# >>> punto_de_silla([[11,12],[14,9]])
# False
# >>> punto_de_silla([[1,4,3,2],[9,8,7,6],[5,10,11,13],[12,14,15,16]])
# (0, 1)
# -------------------------------------------------------------------------
#
def punto_de_silla(m):
    nfilas=len(m)
    ncols=len(m[0])
    max_filas=[float("inf")]*len(m)
    min_col=[float("-inf")]*len(m[0])
    for i in range(nfilas):
        for j in range(ncols):
            if m[i][j]>max_filas[i]:
                max_filas[i]=m[i][j]
            if m[i][j]<min_col[j]:
                min_col[j]=m[i][j]
 
 
    for i in range(nfilas):
       for j in range(ncols):
           puntos_silla=[]
           if max_filas[i]==min_col[j]:
               puntos_silla.append((i,j))
           else:
               return False
    return puntos_silla
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
sin imagen de perfil
Val: 156
Ha disminuido 1 puesto en Python (en relación al último mes)
Gráfica de Python

Error que no localizo

Publicado por Andrés (55 intervenciones) el 04/11/2017 03:27:03
El fallo es el uso de float("inf") en max_filas y min_col, aún después de arreglar eso, las matrices de comparación no son las adecuadas.

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
#!/usr/bin/python3
 
import sys
 
def punto_de_silla(matriz):
    #La matriz es cuadrada, así que sólo necesitamos una variable 
    n = len(matriz)
    #Por cada renglón 
    for i in range(n):
        #Elemento máximo en el renglón  
        max_row = 0
        #Columna del elemento máximo 
        columna = 0
        #Por cada columna
        for j in range(n):
            #Si el elemento (i,j) es mayor que el supuesto máximo 
            if matriz[i][j] > max_row:
                #Actualizar el elemento máximo
                max_row=matriz[i][j]
                #Actualizar la columna del elemento máximo  
                columna = j
 
        #En este punto, (i, columna) identifican el renglón y la columna del 
        #elemento máximo del renglón
 
        #Ubicar para esta columna la ubicación el elemento mínimo
        #Elemento mínimo en la columna  
        min_col = sys.float_info.max
        #Renglón del elemento mínimo
        renglon = 0
        #Para cada renglón 
        for k in range(n):
            #Si el elemento (k, columna) es menor que el supuesto mínimo
            if matriz[k][columna] < min_col:
                #Actualizar el mínimo de la columna
                min_col=matriz[k][columna]
                #Actualizar el renglón del elemento mínimo
                renglon = k
        #Dado que estamos trabajando sobre la misma columna, sólo queda comparar
        #si los renglones son iguales
        if renglon == i:
            #Terminamos  
            return (renglon, columna)
 
    #No hay punto de silla
    return False
 
if __name__ == '__main__':
 
    print(punto_de_silla([[1,2,3],[4,5,6],[7,8,9]]))
    print(punto_de_silla([[11,12],[14,9]]))
    print(punto_de_silla([[1,4,3,2],[9,8,7,6],[5,10,11,13],[12,14,15,16]]))

Screenshot-from-2017-11-03-20-34-33
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

Error que no localizo

Publicado por Raquel (12 intervenciones) el 04/11/2017 07:14:01
Hola, gracias por tu respuesta. No he dado el comando says en clase. ¿ me podrías decir una alternativa a el?
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
sin imagen de perfil
Val: 156
Ha disminuido 1 puesto en Python (en relación al último mes)
Gráfica de Python

Error que no localizo

Publicado por Andrés (55 intervenciones) el 04/11/2017 14:43:45
Puedes usarlo 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
46
47
48
49
50
51
#!/usr/bin/python3
 
def punto_de_silla(matriz):
    #La matriz es cuadrada, así que sólo necesitamos una variable 
    n = len(matriz)
    #Por cada renglón 
    for i in range(n):
        #Elemento máximo en el renglón  
        max_row = 0
        #Columna del elemento máximo 
        columna = 0
        #Por cada columna
        for j in range(n):
            #Si el elemento (i,j) es mayor que el supuesto máximo 
            if matriz[i][j] > max_row:
                #Actualizar el elemento máximo
                max_row=matriz[i][j]
                #Actualizar la columna del elemento máximo  
                columna = j
 
        #En este punto, (i, columna) identifican el renglón y la columna del 
        #elemento máximo del renglón
 
        #Ubicar para esta columna la ubicación el elemento mínimo
        #Elemento mínimo en la columna, supuesto mínimo es el 
        #primer elemento de la columna
        min_col = matriz[0][columna]
        #Renglón del elemento mínimo
        renglon = 0
        #Para cada renglón 
        for k in range(n):
            #Si el elemento (k, columna) es menor que el supuesto mínimo
            if matriz[k][columna] < min_col:
                #Actualizar el mínimo de la columna
                min_col=matriz[k][columna]
                #Actualizar el renglón del elemento mínimo
                renglon = k
        #Dado que estamos trabajando sobre la misma columna, sólo queda comparar
        #si los renglones son iguales
        if renglon == i:
            #Terminamos  
            return (renglon, columna)
 
    #No hay punto de silla
    return False
 
if __name__ == '__main__':
 
    print(punto_de_silla([[1,2,3],[4,5,6],[7,8,9]]))
    print(punto_de_silla([[11,12],[14,9]]))
    print(punto_de_silla([[1,4,3,2],[9,8,7,6],[5,10,11,13],[12,14,15,16]]))
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

Error que no localizo

Publicado por Raquel (12 intervenciones) el 04/11/2017 15:42:29
Gracias, lo de la última fila Justo antes de los orienta tampoco se q es. ¿ me lo podrías explicar o decirme alguna alternativa? Siento de nuevo las molestias y muchas gracias.
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
sin imagen de perfil
Val: 156
Ha disminuido 1 puesto en Python (en relación al último mes)
Gráfica de Python

Error que no localizo

Publicado por Andrés (55 intervenciones) el 04/11/2017 17:34:33
A qué te refieres con: "antes de los orienta" ?
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

Error que no localizo

Publicado por Raquel (12 intervenciones) el 04/11/2017 17:46:23
Quería decir antes de los print. Se ve que el corrector me lo ha cambiado y no me he dado cuenta perdona.
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
sin imagen de perfil
Val: 156
Ha disminuido 1 puesto en Python (en relación al último mes)
Gráfica de Python

Error que no localizo

Publicado por Andrés (55 intervenciones) el 04/11/2017 17:55:51
Esa linea significa que si otro programa importa este archivo, este último se ejecuta mmm para este caso puedes eliminar esa linea y te queda:

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
#!/usr/bin/python3
 
 
def punto_de_silla(matriz):
    #La matriz es cuadrada, así que sólo necesitamos una variable 
    n = len(matriz)
    #Por cada renglón 
    for i in range(n):
        #Elemento máximo en el renglón  
        max_row = 0
        #Columna del elemento máximo 
        columna = 0
        #Por cada columna
        for j in range(n):
            #Si el elemento (i,j) es mayor que el supuesto máximo 
            if matriz[i][j] > max_row:
                #Actualizar el elemento máximo
                max_row=matriz[i][j]
                #Actualizar la columna del elemento máximo  
                columna = j
 
        #En este punto, (i, columna) identifican el renglón y la columna del 
        #elemento máximo del renglón
 
        #Ubicar para esta columna la ubicación el elemento mínimo
        #Elemento mínimo en la columna  
        min_col = matriz[0][columna]
        #Renglón del elemento mínimo
        renglon = 0
        #Para cada renglón 
        for k in range(n):
            #Si el elemento (k, columna) es menor que el supuesto mínimo
            if matriz[k][columna] < min_col:
                #Actualizar el mínimo de la columna
                min_col=matriz[k][columna]
                #Actualizar el renglón del elemento mínimo
                renglon = k
        #Dado que estamos trabajando sobre la misma columna, sólo queda comparar
        #si los renglones son iguales
        if renglon == i:
            #Terminamos  
            return (renglon, columna)
 
    #No hay punto de silla
    return False
 
print(punto_de_silla([[1,2,3],[4,5,6],[7,8,9]]))
print(punto_de_silla([[11,12],[14,9]]))
print(punto_de_silla([[1,4,3,2],[9,8,7,6],[5,10,11,13],[12,14,15,16]]))
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