Определите дубликаты в списке списков и суммируйте их последние позиции

У меня есть список списков, из которых я хотел бы удалить дубликаты и суммировать последние элементы дубликатов. Элемент является дубликатом, если его первые 2 элемента одинаковы. Это лучше иллюстрируется примером:

input = [['a', 'b', 2], ['a', 'c', 1], ['a', 'b', 1]] # Desired output output = [['a', 'b', 3], ['a', 'c', 1]] 

Здесь есть похожие вопросы, но я не нашел того, который будет обрабатывать список списков и суммировать элементы списка одновременно.

Я пробовал несколько подходов, но не мог заставить его работать:

  • создайте копию списка входных данных, создайте вложенный цикл, если будет найден второй дубликат, добавьте его последний элемент в оригинал -> это слишком запутывает слишком много гнездования
  • Я просмотрел коллекции Counter, но, похоже, не работает со списком списков
  • itertools

Не могли бы вы дать мне какие-либо указания о том, как подойти к этой проблеме?

5 Solutions collect form web for “Определите дубликаты в списке списков и суммируйте их последние позиции”

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

 from collections import defaultdict data = [['a', 'b', 2], ['a', 'c', 1], ['a', 'b', 1]] result = collections.defaultdict(int) # new keys are auto-added and initialized as 0 for item in data: a, b, value = item result[(a,b)] += value print result # defaultdict(<type 'int'>, {('a', 'b'): 3, ('a', 'c'): 1}) print dict(result) # {('a', 'b'): 3, ('a', 'c'): 1} print [[a, b, total] for (a, b), total in result.items()] # [['a', 'b', 3], ['a', 'c', 1]] 

Вы можете использовать Counter ; кто-то уже дал ручное решение по defaultdict ; так что вот itertools.groupby один, просто для разнообразия:

 >>> from itertools import groupby >>> inp = [['a', 'b', 2], ['a', 'c', 1], ['a', 'b', 1]] >>> [k[:2] + [sum(v[2] for v in g)] for k,g in groupby(sorted(inp), key=lambda x: x[:2])] [['a', 'b', 3], ['a', 'c', 1]] 

но я полагаю, что словарь (или подкласса dict, как defaultdict или Counter), вероятно, является лучшей структурой данных.

Также было бы более общим использовать [:-1] и [-1] вместо [:2] и [2] , но я слишком ленив, чтобы внести изменения. 🙂

Я предпочитаю такой подход:

 >>> from collections import Counter >>> from itertools import repeat, chain >>> sum((Counter({tuple(i[:-1]): i[-1]}) for i in input), Counter()) Counter({('a', 'b'): 3, ('a', 'c'): 1}) 

(Спасибо @DSM за указание на улучшение моего первоначального ответа.)

Если вы хотите его в форме списка:

 >>> [[a, b, n] for (a,b),n in _.items()] [['a', 'b', 3], ['a', 'c', 1]] 
 >>> t = [['a', 'b', 2], ['a', 'c', 1], ['a', 'b', 1]] >>> sums = {} >>> for i in t: sums[tuple(i[:-1])] = sums.get(tuple(i[:-1]),0) + i[-1] >>> output = [[a,b,sums[(a,b)]] for a,b in sums] >>> output [['a', 'b', 3], ['a', 'c', 1]] 
 inp = [['a', 'b', 2], ['a', 'c', 1], ['a', 'b', 1], ['a', 'c', 2], ['a', 'b', 4]] lst = [] seen = [] for i, first in enumerate(inp): if i in seen: continue found = False count = first[-1] for j, second in enumerate(inp[i + 1:]): if first[:2] == second[:2]: count += second[-1] found = True seen.append(i + j + 1) if found: lst.append(first[:-1] + [count]) else: lst.append(first) print(lst) # [['a', 'b', 7], ['a', 'c', 3]] 
  • Как удалить диапазон (подраздел) списка в Python?
  • Как я могу умножить каждый элемент в списке на число?
  • Хранение элементов одного списка, в другом списке - по ссылке - в Python?
  • Изменение нечислового списка на числовое?
  • Создание 2d-матрицы в python
  • Определение списка в Python с использованием оператора умножения
  • Вычислить разницу между смежными элементами в списке python
  • python - если не в списке
  • Is 'for x in array' всегда приводит к сортировке x?
  • Python: поиск идентичных элементов в нескольких списках
  • Преобразование списков
  •  
    Interesting Posts for Van-Lav

    Разложим решение системы линейных неравенств

    Проводка в Flask с помощью сообщений Postman и запросов заполняет различные атрибуты запроса

    Как создать новую таблицу данных в Orange?

    Хешировать экземпляр класса нового стиля python?

    pd.rolling_mean становится устаревшим – альтернативы для ndarrays

    Выполните проверку WebDriverWait () или аналогичную проверку регулярного выражения в Python

    Как добавить пространство между двумя виджетами, размещенными в сетке в tkinter ~ python?

    Найти подстроку в строке, но только целые слова?

    добавьте поле в рамку данных pandas с столбцами MultiIndex

    Слияние файлов csv с разными порядками столбцов удаляет дубликаты

    Проблема с установкой MPICH2 и mpi4py

    Есть ли смысл использовать контекстные менеджеры внутри генераторов?

    Django: как протестировать «HttpResponsePermanentRedirect»

    эквивалент python фильтра (), получающий два выходных списка (т.е. раздел списка)

    Максимальное значение в списке списков кортежей

    Python - лучший язык программирования в мире.