Как сгрупировать дубликаты первого элемента во вложенных списках с просуммировав вторые элементы?
Есть список:
[['var1' 'val1'], ['var2' 'val2'], ['var1' 'val4'], ['var3' 'val1'], ['var4' 'val1'], ['var4' 'val15']]
Необходимо создать список с уникальными var и просуммировав значения val
dump = []
f = open('D:\\python\dm.txt')
f.read(1)
i = 0
for line in f:
line = line.rstrip("\n")
line = line.split(' - ', 2)
print(line[0]+' = '+line[1]+ ' шт')
for dat in dump:
if print(dat[0] == line[0]):
print(line[0])
#else:
#dump.append([line[0], line[1]])
i += 1
dump.sort()
print(dump)
Должно получится:
[['var1' 'val1+val4'], ['var2' 'val2'], ['var3' 'val1'], ['var4' 'val1+val15']]
Ответы (3 шт):
Автор решения: Maxim Timakov
→ Ссылка
Напрашивается использование словаря
# create dictionary
result = {}
for line in f:
# parse line...
# skiped
key, val = line
if key in result:
result[key] = result[key] + val
else:
result[key] = val
print(result)
Автор решения: MaxU
→ Ссылка
исходные данные:
data = \
[['var1', 'val1'],
['var2', 'val2'],
['var1', 'val4'],
['var3', 'val1'],
['var4', 'val1'],
['var4', 'val15']]
для решения воспользуйтесь itertools.groupby:
from itertools import groupby
res = [[a, "+".join(el[1] for el in b)]
for a,b in groupby(sorted(data, key=lambda x: x[0]),
key=lambda x: x[0])]
результат:
In [26]: res
Out[26]:
[['var1', 'val1+val4'],
['var2', 'val2'],
['var3', 'val1'],
['var4', 'val1+val15']]
Автор решения: MaxU
→ Ссылка
Похоже у автора вопроса числовые данные на месте второго элемента вложенных списков:
In [7]: data = \
...: [['var1', 11],
...: ['var2', 12],
...: ['var1', 13],
...: ['var3', 14],
...: ['var4', 15],
...: ['var4', 16]]
решение в данном случае будет выглядеть так:
In [8]: res = [[a, sum(el[1] for el in b)]
...: for a,b in groupby(sorted(data, key=lambda x: x[0]),
...: key=lambda x: x[0])]
результат:
In [9]: res
Out[9]: [['var1', 24], ['var2', 12], ['var3', 14], ['var4', 31]]