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

У меня есть список списков, из которых я хотел бы удалить дубликаты и суммировать последние элементы дубликатов. Элемент является дубликатом, если его первые 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]] 
Interesting Posts

Как запустить сервер ipython для ноутбука при загрузке в качестве демона

Python: как определить, является ли атрибут (по имени) атрибутом класса или экземпляра?

Сравнение Нет со встроенными типами с использованием арифметических операторов?

Python Pandas: транспонирование или стеки?

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

разбор URL-адреса в python с изменением его части

Python: закрытие цикла for путем чтения stdout

Как вы получаете выходные параметры из хранимой процедуры в Python?

Почему pandas.to_datetime медленный для нестандартного формата времени, такого как '2014/12/31'

Python: заменить теги, но сохранить внутренний текст?

Можно ли анализировать только параметры одной группы аргументов с помощью argparse?

Модуль мультипроцессорности, отображающий память для каждого дочернего процесса так же, как и основной процесс.

Вложенные ресурсы Tastypie – cached_obj_get () принимает ровно 2 аргумента (1 данный)

Сохранение пользовательской модели с помощью django-allauth

как получить доступ к элементам в 2D-массиве?

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