Encontrar la primera fila de en una matriz que contenga todos los elementos positivos y la suma de estos elementos

publicado por: Anonymous

Encontrar la primera fila de en una matriz que contenga todos los elementos positivos y la suma de estos elementos. Reducir todos los elementos de esta matriz a esta suma.

Para lograr lo requerido debería encontrar el array que tiene todos los elementos positivos, guradar el index de de este array y abrir otro bucle para sumarlos. Cómo podría hacerlo, es decir, cómo encontrar este array y guardarlo?

El objetivo es: obtener la fila de la matriz que tiene todos los elementos positivos, en este caso sería [7,2,3] y sumar estos elementos, que sería 12, y remplazar todos los elemetos de la matriz con el valor de la suma

Este es mi intento, de esta manera suma todos los elementos positivos.

matrix = [[-5, -6, 2], [7, 2, 3], [8, 4, -9]]

summ = 0
for i in range(len(matrix)):
    pos = False
    for j in range(len(matrix[i])):
        if matrix[i][j] > 0:
            pos = True
            summ += matrix[i][j]

if pos:
    for i in range(len(matrix)):
        for j in range(len(matrix[i])):
            matrix[i][j] = summ
    print("Suma: ", summ)
    for i in matrix:
        print(" ",i)

else:
    print("No hay filas con todos elementos positivos.")

solución

Podrías reducir tu función asi:

def suma_nasver(matriz):
    resultado = []
    suma = 0
    for arreglo in matriz:
        # Filtramos cada arreglo de la matriz para saber si contiene por lo menos
        # un elemento negativo, si no tiene ninguno se procede a hacer la suma
        elementos_negativos = list(filter(lambda elem: elem < 0, arreglo))
        if not elementos_negativos:
            # Asumo que es la suma de la primera ocurrencia
            suma = sum(arreglo)
            break
    # No es necesario un flag ya que se puede evaluar simplemente el resultado
    # de la suma
    if suma:
        # Si conocemos el largo de la matriz no es necesario iterarla nuevamente
        # para reemplazar los valores, solo usemos una lista vacia
        [resultado.append([suma]) for _ in range(len(matriz))]
    return resultado

Usando la función:

>>> suma_nasver([[-5, -6, 2], [7, 2, 3], [8, 4, -9]])
[[12], [12], [12]]
>>> suma_nasver([[-5, -6, -2], [-6, -1, 0], [-4, -4, -1]])
[]
>>> suma_nasver([[-2], [3, 3, 3], [-4], [-9], [-4], [0]])
[[9], [9], [9], [9], [9], [9]]

Espero que con los comentarios haya quedado claro. Algunas notas:

  • No es necesario hacer uso de la combinación range() y len() para iterar un objeto que de por si ya es iterable, simplemente pasalo al operador in:

    for arreglo in matriz:
        ...
    
  • La función filter() retorna una lista con los elementos que cumplen cierta condición, en suma_nasver la uso para saber si el arreglo contiene algún elemento negativo:

    elementos_negativos = filter(lambda elem: elem < 0, arreglo)
    
  • Estoy usando una lista de comprehensión pero sin guardar el resultado ya que solo me interesa el procesamiento de esa parte del código (por eso también uso como variable a _, que nos dice que realmente no nos interesa su valor):

    [resultado.append([suma]) for _ in range(len(matriz))]
    
  • No especificaste la versión de Python, pero la he modificado y probado para que funcione para Python 2 y 3

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *