Задать вопрос
  • Как сгруппировать списки по двум элементам?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    UPD: Поправил чуть способ со счетчиком:
    In [1]: list_in = [['Игрушки', 'Мяч надувной', '300', '1'], ['Игрушки', 'Бионикл', '8000', '1'], ['Ткань', 'Вельвет', '1000', '2'], ['Ткань', 'Джинса', '500', '2'], ['Игрушки', 'Бионикл', '1000', '2']]
    
    In [2]: from collections import Counter
    
    In [3]: c = Counter(); list(map(c.update, ({(cat, stor): int(price)} for cat, name, price, stor in list_in)))
    Out[3]: [None, None, None, None, None]
    
    In [4]: c
    Out[4]: Counter({('Игрушки', '1'): 8300, ('Игрушки', '2'): 1000, ('Ткань', '2'): 1500})
    
    In [5]: [[*k, v] for k, v in c.items()]
    Out[5]: [['Игрушки', '1', 8300], ['Ткань', '2', 1500], ['Игрушки', '2', 1000]]


    Но иногда нужно не просто считать, а что-то еще более сложное делать после группировки, тогда больше подойдёт вот такой вариант:
    In [11]: from itertools import groupby                                                              
    
    In [12]: [[*k, sum(int(rr[2]) for rr in v)] for k, v in groupby(list_in, lambda r: (r[0], r[-1]))]
    Out[12]: [['Игрушки', '1', 8300], ['Ткань', '2', 1500], ['Игрушки', '2', 1000]]

    Тут синтаксис третьего питона. Для второго придётся чуть поменять со звёздочкой.
    Ответ написан
    Комментировать