2017-02-20 5 views
0

Я пытаюсь подвести кучу списка по индексу, как:сумма между значениями Листа по индексу

a = [[1,2,3], [2,3,4], [3,4,5]] 

output = [ reduce(lambda x, y: x[_count] + y[_count], a) 
      if _count in [0,2] else "" for _count in xrange(len(a)) ] 

Это должно быть для меня и ожидаемого результата:

>>> output 
[6, "", 12] 

но я получил:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 1, in <lambda> 
TypeError: 'int' object has no attribute '__getitem__' 

Возможно, я не понимаю двигатель понижения.

Я делаю что-то неправильно?

+0

Почему вы используете 'reduce' вместе со списком понимания? –

+0

Я думал, что сокращение вернет int, и мне нужно будет итерации, чтобы суммировать определенные индексы. Если есть что-то похожее, я все уши –

+0

держись, как вы хотите суммировать? 'a [0] [0] + a [0] [1] + ...' или 'a [0] [0] + a [1] [0] + ...' –

ответ

1

Я не понимаю, почему вы используете reduce. reduce также работает и над списком, так как он представляет собой список целых чисел не менее y в выражении лямбда, таким образом, будет int eger, который не является сценарием (например, вы не можете получить 2[1]).

Однако вы можете использовать sum и список понимание для этого:

output = [sum(ai) if i in (0,2) else "" for i,ai in enumerate(a)] 

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

output = [sum(ai[i] for ai in a) if i in (0,2) else "" for i in range(len(a))] 

Или, если вы хотите, чтобы вычислить a[0][0]+a[1][0]+a[2][0]+... и так далее, вы можете использовать reduce, аккумулятор должен начать с 0 и добавить y[_count] к x (не x[_count]):

from functools import reduce 

output = [reduce(lambda x,y:x+y[i],a,0) if i in (0,2) else "" for i in range(len(a))] 
+0

Вот и все! Я понял! Огромное спасибо. Просто знать, почему x + y [i], а не x [i] + y [i]? –

+0

@RenanQuirino: потому что '0' является * аккумулятором *. Поскольку указано, что начальное значение равно '0' (третий аргумент), в первом вызове' x' будет '0' и' y' - первый список. Итак, вы вычисляете 't = 0 + a [0] [0]'. Результат 't' вы передаете как' x' второй раз (опять-таки 'int') и так далее. –

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