Python (списки): как группировать дубликаты меток, суммируя их соответствующие значения - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть два списка в Python 3.7: один для меток, а другой для значений.Каждая из меток содержит одно соответствующее значение и есть дублированные метки.

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

Пример того, что у меня есть:

labels = ['05/Feb/2019', '05/Feb/2019', '05/Feb/2019', '01/Feb/2019']
values = ['2', '5', '7', '4'] 

Что мне нужно, это:

labels = ['05/Feb/2019', '01/Feb/2019']
values = ['14', '4']

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Вы можете использовать itertools.groupby для группировки обоих списков, сжатых вместе, и добавить элементы в values с общими labels:

from itertools import groupby
from operator import itemgetter

z = zip(labels,values)
r = [(k, sum(int(i[1]) for i in v)) for k,v in groupby(z, key=itemgetter(0))]
labels, values = map(list, zip(*r))

print(labels)
# ['05/Feb/2019', '01/Feb/2019']

print(values)
# [14, 4]
0 голосов
/ 27 февраля 2019

Вы можете использовать Counter:

from collections import Counter

labels = ['05/Feb/2019', '05/Feb/2019', '05/Feb/2019', '01/Feb/2019']
values = ['2', '5', '7', '4']

c = Counter(l for l, v in zip(labels, values)
              for _ in range(int(v)))
# Counter({'05/Feb/2019': 14, '01/Feb/2019': 4})

labels = list(c)
# ['05/Feb/2019', '01/Feb/2019']

values = list(c.values())
# [14, 4]
0 голосов
/ 27 февраля 2019

Легким способом было бы создать по умолчанию dict, а затем развернуть его

from collections import defaultdict

result = defaultdict(float)

for label, value in zip(labels, values):
    result[label] += float(value)

labels, values = zip(*result.items())
...