2015-03-06 3 views
1

У меня есть проблема, которая превзошла новичок в знаниях python, и я надеюсь, что кто-то там может указать мне в правильном направлении.Суммируя значения во вложенном списке при изменении объекта

Я создал вложенный список, каждый вложенный список, состоящий из двух (извините, ребята, моя вина!) Значения, как:

[[1, 0],[1, 2],[2, 9],[3, 0],[3, 8],[3, 1]] 

Первое значение всегда обозначает день, второй один всегда значение Меня действительно интересует. Но мне нужно суммировать все эти два значения, которые происходят в данный день, например: например 0 + 2 в день 1 и 9 на 2-й день и 0 + 8 + 1 на 3-й день

и сгенерировать список, который фактически выглядит как [[1,2][2,9][3,9]], снова с каждым первым значением, дающим день, по которому я суммировал, и второе значение в виде суммы всех значений в этот день.

Я знаю, что это довольно простая проблема, и я бы знал, как ее решить, например. gawk или fortran, но я хочу научиться тому, как это сделать питоническим способом. Я изучил использование zip/map, но я не знаю, как настроить его для этой конкретной проблемы. Я надеюсь, что кто-то там может указать мне в правильном направлении

+0

я нашел только два значения. –

+0

Что значит Авинаш? Я не понимаю ваш комментарий, пожалуйста, будьте более конкретным. – eko13

+0

Вы сказали, что каждый вложенный список состоит из 3 значений, но кажется, что ваш вложенный список содержит 2 элемента день и значение. –

ответ

2

Вы можете поместить ключ в словарь и сохранить значения в значениях. Как это:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

a = [[1, 0],[1, 2],[2, 9],[3, 0],[3, 8],[3, 1]] 
res = {} 
for i in a: 
    if i[0] in res: 
     res[i[0]] += i[1] 
    else: 
     res[i[0]] = i[1] 

print res 

ВЫВОД:

{1: 2, 2: 9, 3: 9} 

Этот вывод в формате словаря. Вы можете повернуть его в формат списка по своему усмотрению.

+1

'i [0] в res' будет более эффективным. –

+0

Хорошая идея, я должен был сразу осознать, что ключи могут быть ответом! Спасибо всем за ваши указатели! – eko13

+1

@TanveerAlam Да. Благодаря! –

1

В этом случае возникает проблема itertools.groupby. В частности groupby, группирует последовательные значения с одинаковыми клавишами, где ключи могут быть указаны пользователем. Тем не менее, в этом случае ключ достаточно тривиален, как индексирование определенного элемента списка, поэтому это должно быть достаточной причиной для использования operator.itemgetter. Наконец, вы можете завернуть либо как функциональный (используя map/imap), либо как выражение генератора, основанное на вашем вкусе и выборе.

>>> from itertools import groupby, imap 
>>> from operator import itemgetter 
>>> lst=[[1, 0],[1, 2],[2, 9],[3, 0],[3, 8],[3, 1]] 
>>> [[k, sum(imap(itemgetter(1), v))] 
    for k, v in groupby(lst,key = itemgetter(0))] 
[[1, 2], [2, 9], [3, 9]] 
0

Вот вариация на тему техники m170897017 в:

a = [[1, 0],[1, 2],[2, 9],[3, 0],[3, 8],[3, 1]] 

result = {} 
for day, val in a: 
    if day not in result: 
     result[day] = 0 
    result[day] += val 

print result 

#Convert back into a list 
print [list(t) for t in result.items()] 

выход

{1: 2, 2: 9, 3: 9} 
[[1, 2], [2, 9], [3, 9]] 

Если вы используете Python 2.7 или более поздней версии, вы можете также использовать Counter.

Другая возможность - использовать defaultdict, который был доступен с Python 2.5.

from collections import defaultdict 

a = [[1, 0],[1, 2],[2, 9],[3, 0],[3, 8],[3, 1]] 

result = defaultdict(int) 
for day, val in a: 
    result[day] += val 

print [list(t) for t in result.items()] 

выход

[[1, 2], [2, 9], [3, 9]] 
0

Вы можете попробовать использовать defaultdict ...

from collections import defaultdict 

dat = [[1, 0],[1, 2],[2, 9],[3, 0],[3, 8],[3, 1]] 

d = defaultdict(int) 
for k,v in dat: d[k] += v 
0

Вы можете использовать collections.OrderedDict отображение items в список:

l = [[1, 0],[1, 2],[2, 9],[3, 0],[3, 8],[3, 1]] 

from collections import OrderedDict 
d = OrderedDict() 

for a, b in l: 
    d.setdefault(a, 0) 
    d[a] += b 
print(map(list,d.iteritems())) 

[[1, 2], [2, 9], [3, 9]] 
Смежные вопросы