суммировать одинаковые элемента списка python
Дан список:
s1 = [['REDHEA', 3], ['GADWAL', 1], ['SMEW', 4], ['GRESCA', 10], ['REDHEA', 3], ['GADWAL', 9], ['GRESCA', 15], ['COMEID', 6]]
необходимо суммировать цифровые значения у одинаковых имен:
["COMEID", 6, "GADWAL", 10, "GRESCA", 25, "REDHEA", 6, "SMEW", 4]
после долгих мучений подсмотрел такой варинт:
s2 = {}
for i in s1:
if i[0] in s2:
s[i[0]] += i[-1]
else:
s[i[0]] = i[-1]
создаю словарь, в него добавляю первый элемент вложенного списка, если первый элемент вложенного списка уже есть как ключ в словаре, суммирую значения ключа... но мне выдает ошибку:
TypeError: list indices must be integers or slices, not str
не знаю как это победить, ведь на примере, который я опробовал, все работало:
a = [['a', 2], ['b', 3], ['c', 4], ['a', 5]]
s = {}
for i in a:
if i[0] in s:
s[i[0]] += i[1]
else:
s[i[0]] = i[1]
print(s)
может многоуважаемая публика подскажет как решить эту проблему, или подскажет другое решение?
Ответы (2 шт):
Существует такой подход к заполнению словаря.
s1 = [['REDHEA', 3], ['GADWAL', 1], ['SMEW', 4], ['GRESCA', 10], ['REDHEA', 3], ['GADWAL', 9], ['GRESCA', 15], ['COMEID', 6]]
d1 = {}
for name, value in s1:
d1[name] = d1.get(name, 0) + value
s2 = list(sum(d1.items(), ()))
Вот вам для общего развития вариант решения с pandas:
mport pandas as pd
s1 = [['REDHEA', 3], ['GADWAL', 1], ['SMEW', 4], ['GRESCA', 10], ['REDHEA', 3], ['GADWAL', 9], ['GRESCA', 15], ['COMEID', 6]]
res = pd.DataFrame(s1).groupby(0).sum().reset_index().squeeze().values.ravel().tolist()
res:
['COMEID', 6, 'GADWAL', 10, 'GRESCA', 25, 'REDHEA', 6, 'SMEW', 4]