Сбор последних элементов списка списков в список

Есть список со списками, максимальное количество элементов в списке 3

inp = [
    ['A1', 'B1', 'A1'],
    ['A1', 'B1', 'A2'],
    ['A1', 'B1', 'A3'],
    ['A1', 'B2', 'A4'],
    ['A1', 'B2', 'A5'],
    ['A2', 'B1', 'A6'],
    ['A2', 'B1', 'A7']
]

Первый и второй элемент списка часто дублируется, а 3й элемент разный. Надо чтобы первый и второй элемент списка не дублировался, 3е элементы собирались в список. В результате должен получиться вот такой список списков

out = [
    ['A1', 'B1', ['A1', 'A2', 'A3']],
    ['A1', 'B2', ['A4', 'A5']],
    ['A2', 'B1', ['A6', 'A7']]
]

Подскажите пжлст, я не понимаю как это сделать


Ответы (1 шт):

Автор решения: MaxU

Вариант 1 - используем itertools.groupby(...):

from itertools import groupby

inp = [
    ['A1', 'B1', 'A1'],
    ['A1', 'B1', 'A2'],
    ['A1', 'B1', 'A3'],
    ['A1', 'B2', 'A4'],
    ['A1', 'B2', 'A5'],
    ['A2', 'B1', 'A6'],
    ['A2', 'B1', 'A7']
]

res = [[k[0], k[1], [t[2] for t in c]] 
        for k,c in groupby(sorted(inp), key=lambda x: (x[0], x[1]))]

print(res)

результат

[['A1', 'B1', ['A1', 'A2', 'A3']],
 ['A1', 'B2', ['A4', 'A5']],
 ['A2', 'B1', ['A6', 'A7']]]

Вариант 2 - используем модуль Pandas:

import pandas as pd  # pip install pandas

df = pd.DataFrame(inp)
res = df.groupby([0,1])[2].apply(list).reset_index().to_numpy().tolist()
→ Ссылка