0

Каков наилучший способ группировки/объединения/сокращения кортежей python следующим образом (без использования вложенных циклов).Как группировать/суммировать/уменьшать третьи значения списка/кортежа python по первым двум значениям (без использования для циклов)?

К примеру, учитывая следующие кортежи:

entry1 = ('name1', 'surname1', 'product1') 
entry2 = ('name1', 'surname1', 'product2') 
entry3 = ('name1', 'surname1', 'product3') 
entry4 = ('name2', 'surname2', 'product1') 
entry5 = ('name2', 'surname2', 'product2') 
entry6 = ('name2', 'surname2', 'product3') 

Как может функция func:

func(entry1, entry2, entry3, entry4, entry5, entry6) 

возвращение данные в том же формате:

(('name1', 'surname1', ('product1', 'product2', 'product3')), 
('name2', 'surname2', ('product1', 'product2', 'product3'))) 

Примечания:

  • Порядок получения результатов не имеет значения.
  • Результатом может быть список или кортеж
  • Обеспечение уникальности продукта в порядке, однако не требуется. То есть результаты, такие как ('name1', 'surname1', ('product1', 'product1', 'product2', 'product3')), являются точными.
+0

Почему 'Имя2 'и' surname2' идут до 'name1' и' surname1'? – Ryan

+0

Хорошая точка! Я забыл упомянуть, что порядок в результатах не важен, обновил сообщение, чтобы отразить это – Greg

ответ

1

Вы можете использовать collections.defaultdict к группе первой, а затем преобразовать в список или кортеж:

from collections import defaultdict 

def func(*args): 
    d = defaultdict(list) 
    for entry in args: 
     d[entry[0], entry[1]].append(entry[2]) 
    return tuple((k[0], k[1], tuple(v)) for k, v in d.items()) 

Тест:

entry1 = ('name1', 'surname1', 'product1') 
entry2 = ('name1', 'surname1', 'product2') 
entry3 = ('name1', 'surname1', 'product3') 
entry4 = ('name2', 'surname2', 'product1') 
entry5 = ('name2', 'surname2', 'product2') 
entry6 = ('name2', 'surname2', 'product3') 
print(func(entry1, entry2, entry3, entry4, entry5, entry6)) 

Результат:

(('name1', 'surname1', ('product1', 'product2', 'product3')), 
('name2', 'surname2', ('product1', 'product2', 'product3'))) 
+0

Это невероятно эффективно, спасибо :) – Greg