Находить первую линию в массиве, который содержал бы все положительные элементы и сумму этих элементов

Находить первую линию в массиве, который содержал бы все положительные элементы и сумму этих элементов. Сводить все элементы этого массива к этой сумме.

Чтобы добиваться разыскиваемого он был бы должен находить array, у которого есть все положительные элементы, guradar index этого array, и открывать другой цикл, чтобы складывать их. Как он мог бы заставлять это, а именно, как находить этот array и сохранять это?

Цель: получать линию массива, у которого есть все положительные элементы, в этом случае было бы [7,2,3] и складывать эти элементы, которые его было бы 12, и remplazar все elemetos массива со стоимостью суммы

Это моя попытка, таким образом складывает все положительные элементы.

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.")
21
задан 10.01.2016, 18:29
7 ответов

PodrГ-схвати уменьшать ты funciГіn так:

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

Используя ее 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]]

Надеялся, что с комментариями он остался ясным. Какие-то замечания:

  • не необходим использовать ее combinaciГіn range() и len(), чтобы повторять объект, что, если уже он iterable, просто перемести это оператора in:

    for arreglo in matriz:
        ...
    
  • funciГіn filter() возвращает список с элементами, которые истекают верная condiciГіn, в suma_nasver я использую ее, чтобы знать, содержит ли договоренность algГєn отрицательный элемент:

    elementos_negativos = filter(lambda elem: elem < 0, arreglo)
    
  • я использую список comprehensiГіn , но не сохраняя результата, так как только меня интересует обработка этой части cГіdigo (поэтому tambiГ©n такое использование как переменная в _, который говорит нам, что действительно нас не интересует Ваша стоимость):

    [resultado.append([suma]) for _ in range(len(matriz))]
    
  • ты не определил ее versiГіn Пайтона, но я изменил и протестировал ее для того, чтобы оно функционировало для Пайтона 2 и 3

10
ответ дан 24.11.2019, 15:00
  • 1
    Я думаю, что ты должен менять elementos_negativos = filter(lambda elem: elem < 0, arreglo) на что-то как: no_positivos = filter(lambda elem: elem <= 0, arreglo), потому что нуля нет один n и # 250; простой позитив. – Javier Cárdenas 10.01.2016, 20:50

Эта та soluciГіn больше pythonica, чем я ocurriГі:

# Variable que guarda la suma de los numeros positivos por fila
suma_positivos = 0
# Recorremos la matriz fila por fila
for fila in matrix:
    # Verifica si todos los numeros de esta fila son positivos
    if all([numero > 0 for numero in fila]):
            suma_positivos =  sum(fila)
            # Se encontró la fila de positivos, entonces sal del ciclo                
            break

# Si se encontró la fila de positivos, entonces crea la nueva matriz
if suma_positivos:
    new_matrix = [[suma_positivos for value in matrix] for row in matrix]

ЗАМЕЧАНИЙ

[numero > 0 for numero in fila] - список comprensiГіn .

того, что он делает, состоит в том, что создавать новый список со стоимостью booleanos (True/False)

Например

[numero > 0 for numero in [1,2,3]]  # devuelve [True, True, True]
[numero > 0 for numero in [-1,2,3]] # devuelve [False, True, True]

all - один funciГіn, что возвращает True, если все элементы списка истинные.

Например:

all([True, True, True]) # devuelve True
all([False, True, True]) # devuelve False
9
ответ дан 24.11.2019, 15:00

По моему мнению есть слишком много циклов "for". Пайтон содержит много элементов функционального программирования, которые могут помогать решать проблему работоспособной формы (или эффективная). В этом случае:

matrix = [[-5, -6, 2], [7, 2, 3], [8, 4, -9]]
sumallpos = sum(next((x for x in matrix if min(x) > 0), [0]))
if sumallpos:
    matrix = [[sumallpos for x in y] for y in matrix]
else:
    print("No hay filas con todos elementos positivos.")

Использование одного generator вместе с next уверь, что не анализируются все линии массива, так как для как только находится какая-то в, которая все элементы больше, чем нуль min(x) > 0

Вытекающий массив в примере:

[[12, 12, 12], [12, 12, 12], [12, 12, 12]]

Использование list comprehension укрытые уверь, что у вытекающего массива есть те же размеры, что и оригинал, так как он повторяется на первоначальных элементах (если эффективнее повторять на элементах или на чем-то как range(len(x) это мука другого мешка

8
ответ дан 24.11.2019, 15:00

В обобщенные счета:

matrix = [[-5, -6, 2], [7, 2, 3], [8, 4, -9]]
sumas = [sum(xs) for xs in matrix if all(x > 0 for x in xs)]
if len(sumas) > 1:
    suma = sumas[0]
    print("Suma: ", suma)
    matrix = [[suma for _ in xs] for xs in matrix]
else:
    print("No hay filas con todos elementos positivos.")
6
ответ дан 24.11.2019, 15:00

Мне приходит в голову следующее (предполагая, что был массивом, и у всех линий был тот же самый nГєmero колонн)

try:
   suma = sum(next(row for row in matrix if all(num>0 for num in row)))
except StopIteration as err:
   # No hay ninguna fila en que todos sean positivos
   pass
else:
   # Esto es posible suponiendo que todas las filas
   # tengan las mismas columnas
   matrix = [[suma]*len(matrix[0])]*len(matrix)
6
ответ дан 24.11.2019, 15:00

я думаю, что это - то, в чем ты нуждаешься:

def reemplazar(mat,val):
    for r in range(len(mat)):
        if isinstance(mat[r],list):
            reemplazar(mat[r],val)
        else:
            mat[r]=val



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

summ = 0
for i in range(len(matrix)):
    for j in range(len(matrix[i])):
        if matrix[i][j] >=0:
            summ += matrix[i][j]
        else:
            summ=0
            break #si tiene negativos, lo descarto
    if summ >0:
        print summ
        reemplazar(matrix,summ)
        print(matrix)
        break
else:
   print("No hay filas con todos elementos positivos.")

функция заменять в действительно "грубой", только заменяет всю стоимость списка и укрытых списков.

вкратце, повторять из-за каждой готовой (линии), и ты складываешь элементы каждой, если линия содержит отрицательную стоимость, останавливаешь сумму и пребываешь в следующей линии. если у всех линий будет по крайней мере отрицательная стоимость, else выполнит показанный ситуацию.

я не помнил, как делать один продолжал в верхний цикл а следовательно я использовал summ как флаг.

5
ответ дан 24.11.2019, 15:00

я не python, но ты ponder pseudo code aver, если он помогает тебе:

summ;
for a = 0; a < columnas.length; a++ {

  int filasCount = 0;
  summ = 0;

 for b = 0; b < filas.length; b++ {

     if array[a][b] > 0 {
      filasCount ++
      summ += matrix[a][b]
     }
 }
  //si lo de debajo se cumple quiere decir que todos son positivos 
  //en esa fila entoces rompemos el for (no se si en python se puede
  //romper el for) para no perder mas tiempo porque usted quiere la
  //primera fila que sea positiva y si tiene 1000 fila y resulta que la
  //primera es positiva no tiene que siguir buscando con lo que ahorra
  //tiempo

  if filasCount == filas.length (los numeros que tienes que mirar) {
    a = columnas.length + 1 (fuerza la salida del for superior)
  }

  //si no entra en el if quiere decir que ahi alguno negativo asi que el
  //contador se pondra a cero para la siguiente fila en la siguiente
  //vuelta junto con summ

 }

сейчас, когда у тебя есть результат, который ты хочешь в summ только, ты должен распределять это всему array это пробегаешь и распределяешь summ, если я понимаю хорошо твой вопрос, я думаю, что с предыдущим это достаточно, но также комментирую тебе, что, как python у него есть кучи книжного магазина, может быть, какой-либо специфический бук, для которого ты ищешь

, ты С другой стороны мог бы использовать что-либо подобное, чтобы отпускать линии, которые у него есть негативы.

for b = 0; b < filas.length; b++ {

     if array[a][b] > 0 {
      filasCount ++
      summ += matrix[a][b]
     }else{
     //si entra es que es un numero no valido para ti
     //asi que el entra y nosotros salimos pues esa fila no cumple con lo
     //que pedimos, pues ya uno no es valido

      b = filas.length +1
     }
 }
4
ответ дан 24.11.2019, 15:00

Теги

Похожие вопросы