Мне нужно удалить дубликаты из списка, но добавить в них числовое значение - PullRequest
0 голосов
/ 10 мая 2019

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

[('A54', 'ItemName1 ', '18'), ('B52', 'ItemName2 ', '51'), ('C45', 'ItemName3 ', '3'), ('A54', ' ItemName1', '15'), ('G22', ' ItemName5, '78')]

Первый элемент в каждом списке представляет номер элемента, второй - имя элемента, а третий - количество.

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

Я пытался отсортировать список в алфавитном порядке, используя list (), но по какой-то причине, это не работает.

Моя попытка сортировки выглядит следующим образом:

L = [('A54', 'ItemName1 ', '18'), ('B52', 'ItemName2 ', '51'), ('C45', 'ItemName3 ', '3'), ('A54', ' ItemName1', '15'), ('G22', ' ItemName5', '78')]
L.sort()

print (L)

Результат всегда None.

Ответы [ 2 ]

4 голосов
/ 10 мая 2019

вы, вероятно, делаете L = L.sort() ... что объясняет результат None (классическая проблема Почему "return list.sort ()" возвращает None, а не список? )

В любом случае, сортировка + группировка (например, с использованием itertools.groupby) не лучший способ.Плохая сложность: O(n*log(n)) + O(n)

Вместо этого создайте collections.defaultdict и "подсчитайте" свои элементы (collections.Counter здесь не работает, так как количество зависит от значения третьего аргумента, преобразованного в целое число).

Затем перестроите триплеты, распаковав ключи и значения словаря.

import collections

L = [('A54', 'ItemName1', '18'), ('B52', 'ItemName2', '51'),('C45', 'ItemName3', '3'),('A54', 'ItemName1', '15'), ('G22', 'ItemName5', '78')]

d = collections.defaultdict(int)
for a,b,c in L:
    d[a,b] += int(c)

newlist = [(a,b,c) for (a,b),c in d.items()]

результат:

>>> newlist
[('B52', 'ItemName2', 51),
 ('C45', 'ItemName3', 3),
 ('A54', 'ItemName1', 33),
 ('G22', 'ItemName5', 78)]
>>> 

сложность равна O(n)

Обратите внимание, что ваши исходные данные, кажется, содержат конечные / ведущие пробелы.Нет проблем с их удалением при создании нового словаря (иначе группировка не будет работать), например:

d[a,b.strip()] += int(c)
0 голосов
/ 10 мая 2019

Я думаю, что было бы неплохо реализовать словарь, поскольку вы, кажется, рассматриваете первый элемент каждого кортежа как ключ.Лично я бы отсортировал их так:

from collections import OrderedDict

L = [('A54', 'ItemName1 ', '18'), ('B52', 'ItemName2 ', '51'), ('C45', 'ItemName3 ', '3'), ('A54', ' ItemName1', '15'), ('G22', ' ItemName5', '78')]

sorted_L = OrderedDict()
for item in L:
    if item[0] in sorted_L.keys():
        sorted_L[item[0]] += int(item[2])
    else:
        sorted_L[item[0]] = int(item[2])

print(sorted_L)

, что приводит к

OrderedDict ([('A54', 33), ('B52', 51), ('C45)', 3), (' G22 ', 78)])

Но поддерживает порядок в вашем списке, используя OrderedDict вместо обычного словаря.

...