2012-06-08 2 views
2

У меня есть список, который выглядит следующим образом:Sum один столбец из списка (следить)

('string ', 'time', 'SPY', 0, 0, 131.63, 100), 
('sting ', 'time', 'SPY', 0, 0, 131.63, 700) 

, что я хочу сделать, это добавить последний столбец данных

Что я хотя сделать это распаковать список, а затем просуммировать абсолютное значение даты в последней колонке, но я не могу заставить его работать правильно

то, что я пытался это:

testsum = sum(abs(zip(*list[:-1])) 

благодаря

EDIT: ИТАК спасибо за ответ

sum(l[-1]) for l in list 

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

+1

Ваша проблема заключалась в том, где вы делали кусочек списка. 'sum (zip (* l) [- 1])' будет работать. (Очевидно, что под 3.x, где 'zip()' возвращает генератор, вам нужно заключить в 'list()'). –

+0

Вы также не можете использовать 'abs', как вы пытаетесь' abs ((1, -2)) 'не работает. 'map (abs, (1, -2))' делает. – Akavall

ответ

7

генератор выражений ваш друг:

sum(l[-1] for l in list) 

(хотя я надеюсь, что ваш список буквально не называется «списком», так как это затеняет встроенный).

Для последующего действия это зависит от того, что вы подразумеваете под «добавлением всех выведенных сумм». Это может означать наличие некоторого количества списков, таких как тот, который вы опубликовали, который вы повторяете, и вы хотите добавить все суммы вместе один раз. Это было бы:

sum(sum(l[-1] for l in list) for list in lists) 

или даже просто

sum(l[-1] for l in list for list in lists) 

Если вы имеете в виду вы хотите накопленную сумму - таким образом, вы хотите, нарастающим итогом на каждом этапе, как другая внутренняя сумма добавляется к нему - принять посмотрите на this previous question about cumulative sums, или просто написать из цикла:

cumsum = 0 
for list in lists: 
    cumsum += sum(l[1] for l in list) 
    print(cumsum) 
+0

@lvs спасибо, что сработало очень хорошо – Rtrader

+0

@lvc следующий вопрос У меня эта сумма работает в цикле for, и теперь я хочу суммировать все предыдущие суммы, как бы я это сделал? – Rtrader

+0

@ user1440194 Это зависит от того, как выглядят ваши данные и ваш цикл. Но, в общем, вы можете заменить цикл аккумулятора, который делает 'total = 0; для item in iterable: total + = func (item) 'with' sum (func (item) для item in iterable) ', даже если' func' сам является другим вызовом 'sum' с генератором в зависимости от' item'. Но в этом случае может быть лучший способ закодировать его - в зависимости от ваших данных. Если вы имеете в виду, что хотите получить кумулятивную сумму, см., Например, http://stackoverflow.com/questions/4844399/whats-wrong-with-this-cumulative-sum – lvc

2

Учитывая

li = [('string ', 'time', 'SPY', 0, 0, 131.63, 100), 
     ('sting ', 'time', 'SPY', 0, 0, 131.63, 700)] 

это будет работать:

sum(i[-1] for i in li) 
800 

Update: в ответ на обновленный/отредактированной вопрос:

Это не ясно, как ваш список li бы получить его значения внутри цикла, но в целом если у вас была какая-то конструкция вроде

some_limit = .. # how often you need to loop 
total = 0 
for i in range(some_limit): 
    # get new/updated values for li 
    total += sum(i[-1] for i in li) 

print 'Your total is: ', total 
0

sum([item[-1] for item in list]) Вы можете использовать список понятий.

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