2015-02-01 2 views
3

В традиционном питона, функция sum дает сумму в list:сумма первого значения в вложенном списке

sum([0,1,2,3,4])=10 

С другой стороны, что делать, если у вас есть вложенный список, как так:

sum([[1,2,3],[4,5,6],[7,8,9]]) 

мы находим ошибку:

Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
TypeError: unsupported operand type(s) for +: 'int' and 'list' 

В дополнение к этому, как мы могли бы найти sum первых значений (индекс 0) во вложенном списке? Такие, как:

something([[1,2,3],[4,5,6],[7,8,9]])=12 

ответ

6

Чтобы получить сумму всех первых элементов, которые вы должны иметь выражение: Генератор

>>> a = [[1,2,3],[4,5,6],[7,8,9]] 
>>> sum(i[0] for i in a) 
12 

Вы получаете unsupported operand type(s) for +: 'int' and 'list', потому что вы пытаетесь добавить три списков, которые не желаемое поведение.

Если вы хотите получить список первых элементов, а затем найти их сумму, вы можете попробовать список понимание вместо

>>> l = [i[0] for i in a] 
>>> l 
[1, 4, 7] 
>>> sum(l) 
12 

Или вы можете вызвать метод __next__ в список итератора (если PY3)

>>> sum(zip(*a).__next__()) 
12 
1

ИЛИ вы можете использовать zip:

>>> l=[[1,2,3],[4,5,6],[7,8,9]] 
>>> sum(zip(*l)[0]) 
12 
0

You может создать функцию, чтобы найти сумму вложенных списков:

def nested_sum(par): 
    total = 0 
    for k in par: 
     if isinstance(k, list): # checks if `k` is a list 
      total += nested_sum(k) 
     else: 
      total += k 
    return total 

@Kasara и @Bhargav также имеют некоторые аккуратные ответы, проверить их!

0

Для питона начинающих:

При нормальной for цикла и использовать попытаться за исключением обрабатывать исключения, когда побежден список пуст.

>>> l = [[1,2,3],[4,5,6],[7,8,9], []] 
>>> result = 0 
>>> for i in l: 
...  try:result += i[0] 
...  except IndexError:pass 
... 
>>> result 
12 
>>> 
+1

Не используйте старый стиль 'кроме IndexError, é', она присутствует только для обратной совместимости в Python 2 (и удалены в Python 3), используйте: 'except IndexError as e'. BTW, поскольку вы ничего не делаете, за исключением того, что вы просто можете сделать: 'except IndexError'. –

+0

@AshwiniChaudhary: Да, спасибо, чтобы просмотреть мой код, Обновлено сейчас. –

0

Нечто подобное легко с numpy:

In [16]: import numpy as np 

In [17]: a = [[1,2,3],[4,5,6],[7,8,9]] 

In [18]: my_array = np.array(a) 

In [19]: my_array[:,0].sum() 
Out[19]: 12