2015-12-23 7 views
-2

У меня есть этот список в Python:Python элементы списка сумма

[['jhidalgo', 19, u'6,8'], 
['jhidalgo', 19, u'5,3'], 
['jhidalgo', 20, u'7'], 
['jhidalgo', 20, u'0,4'], 
['jhidalgo', 20, u'0'], 
['jhidalgo', 20, u'1,6'], 
['jhidalgo', 21, u'6,9'], 
['jhidalgo', 22, u'1,3'], 
['jhidalgo', 23, u'6,9'], 
['jtern', 19, u'6,9'], 
['jtern', 19, u'3,2'] 
] 

Как я могу получить список, как это ?, просуммировать третьи элементы с тем же вторым элементом и первым

[['jhidalgo', 19, u'12,1'], 
['jhidalgo', 20, u'9'], 
['jhidalgo', 21, u'6,9'], 
['jhidalgo', 22, u'1,3'], 
['jhidalgo', 23, u'6,9'], 
['jtern', 19, u'10,1'] 
] 

мне нужно для суммирования элемента third путем группирования элемента и first.
К примеру, все jhidalgo с 20 ... сумма 7+0.4+0+1.6 = 9

+1

Если третий элемент будет интерпретироваться как Рациональное число? '6.8 + 5.3' суммируется до' 12.1', посредством этой интерпретации. Вы еще что-нибудь пробовали? Где вы застряли? –

+1

Также, ваш вход отсортирован по первой и второй колонке? –

+0

Если вы разместили свою попытку, так как мартиджин говорит, что мы могли бы вам помочь :). – The6thSense

ответ

3

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

import itertools 
from math import fsum 
from operator import itemgetter 

mylist = [...] 

summed = [(name, num, fsum(float(x.replace(',', '.')) for x in g)) 
      for (name, num), g in itertools.groupby(mylist, key=itemgetter(0, 1))] 

Использование groupby - лучшее решение, если данные уже являются последовательными по ключу (и сохраняет порядок без труда), но если значения, которые должны быть сгруппированы, не являются последовательными, вы можете либо отсортировать (по тому же ключу, что и для groupby), т.е. работает mylist.sort(key=itemgetter(0, 1)) перед вычислением summed с groupby, как указано выше, или, чтобы избежать O(n log n) затрат сортировки, вы можете использовать dict (или для простоты, defaultdict(float)) в группе непоследовательных групп:

from collections import defaultdict 

sumdict = defaultdict(float) 
for name, num, val in mylist: 
    sumdict[name, num] += float(val.replace(',', '.')) 

# Side-note: I'd have used tuple/namedtuple for the triples here since the data likely 
# shouldn't be mutable, and tuples are the "proper" type for fixed length, 
# heterogeneous, immutable data, but the functional difference is minimal 
summed = [[name, num, valsum] for (name, num), valsum in sorted(sumdict.items())] 
+0

Моя программа не может импортировать имя fsum. Я не знаю, почему – Madmartigan

+0

@Madmartigan: Ну, это не обязательно (хотя он должен существовать в любом Python 2.6 или выше). Вы можете просто использовать «сумму», если 'fsum' недоступен, [' fsum' - это просто более высокая точность 'sum' специально для' float' (https://docs.python.org/3/library /math.html#math.fsum). – ShadowRanger

+0

@Madmartigan: Side-note: Вероятнее всего, причина 'fsum' недоступна в том, что вы назвали пакет' math' или модуль 'math.py' (или подпакет/подмодуль, если вы находитесь на Python 2.x , не выполнял 'из __future__ import absolute_import', а модуль, импортирующий из' math', является дочерним элементом в подпакет/подмодуль 'math'. – ShadowRanger

3

Вы можете использовать панда, Это отличный модуль питона для анализа данных.

Или:

# sorting 
d = {} 
for name, value, amount in l: 
    if (name, value) not in d: 
     d[name, value] = 0 
    d[name, value] += float(amount.replace(',', '.')) 

# rewriting list 
result = [] 
for (k, v), a in d.items(): 
    result.append([k, v, str(a).replace('.', ',')]) 
+0

спасибо !, Он работает фантастически. Теперь мне нужно изучить код – Madmartigan

+0

OOC, по какой причине вы решили использовать вложенные 'dict's? 'dict's может быть введен ключом' tuple' ('d [name, value]' является совершенно законным), и поскольку мы не используем группировку имен отдельно от группировки «имя, значение», кажется бессмысленным гнездо. – ShadowRanger

+0

Вы правы. Не пришло мне в голову .. Я редактирую – Jl1

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