2016-09-22 3 views
0

Довольно простая проблема, но я все еще практикую повторение нескольких переменных с помощью циклов. В нижеследующем я хочу вернуть новый список, где x - количество положительных чисел, а y - сумма отрицательных чисел из входной матрицы arr.Положительный счетчик // Отрицательная сумма

Если входной массив пуст или равен нулю, я должен вернуться пустой массив.

Вот что у меня есть!

def count_positives_sum_negatives(arr): 
    return [] if not arr else [(count(x), sum(y)) for x, y in arr] 

В настоящее время получения ...

TypeError: 'INT' объект не итерация

+0

Помимо TypeError, я не знаю, где вставить условия x, являющиеся положительными, а y - отрицательными. –

+0

Не могли бы вы привести пример arr? –

+0

@picmate arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11, -12, -13, -14, -15] –

ответ

1

Просто используйте sum понимание путь

>>> arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11, -12, -13, -14, -15] 
>>> sum(1 for x in arr if x > 0) 
10 
>>> sum(x for x in arr if x < 0) 
-65 
+0

, но как я могу вернуть один новый список с учетом обеих переменных? –

+0

Ну, просто назначьте их локальным переменным c, s, затем верните [c, s] – wim

1

Вим хорош. Для этих вещей тоже хорошенький.

import numpy as np 
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11, -12, -13, -14, -15]) 
print([arr[arr >= 0].size, arr[arr < 0].sum()]) 
>> [10, -65] 
1

ошибка вы получаете от этой части for x,y in arr, что означает, что arr, как ожидается, будет список кортежей 2-х элементов (или любой аналогичный контейнер), как, например, это [(1,2), (5,7), (7,9)] но то, что у вас есть список номеров, которые не содержат ничего другого ...

Теперь, чтобы получить результат вашего желания, вы можете использовать решение wim, которое необходимо перебирать по списку дважды, или вы можете получить его за один раз с

>>> def fun(iterable): 
     if not iterable: 
      return [] 
     pos = 0 
     neg = 0 
     for n in iterable: 
      if n>=0: 
       pos = pos + 1 
      else: 
       neg = neg + n 
     return [pos, neg] 

>>> arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11, -12, -13, -14, -15] 
>>> fun(arr) 
[10, -65] 
>>> 
+0

Мне это очень нравится, спасибо вам обоим! Одна модификация, которую я сделал для размещения других входных тестов, заключалась в изменении строки 7 на>, поскольку, похоже, эта проблема обрабатывает 0s как неположительные. –

Смежные вопросы