Сбор последних элементов списка списков в список
Есть список со списками, максимальное количество элементов в списке 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']]
]
Подскажите пжлст, я не понимаю как это сделать
Ответы (2 шт):
Автор решения: 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()
Автор решения: MiniMax
→ Ссылка
Можно сгруппировать с помощью словаря, используя кортеж со значениями первых двух столбцов в качестве ключа.
inp = [
['A1', 'B1', 'A1'],
['A1', 'B1', 'A2'],
['A1', 'B1', 'A3'],
['A1', 'B2', 'A4'],
['A1', 'B2', 'A5'],
['A2', 'B1', 'A6'],
['A2', 'B1', 'A7']
]
dct = {}
for *first_two_cols, third in inp:
key = tuple(first_two_cols)
dct.setdefault(key, [])
dct[key].append(third)
# Переводим словарь в список.
out = [[*first_two_cols, third] for first_two_cols, third in dct.items()]
# Или так
#out = [[first, second, third] for (first, second), third in dct.items()]
from pprint import pprint
pprint(out)
Результат
[['A1', 'B1', ['A1', 'A2', 'A3']],
['A1', 'B2', ['A4', 'A5']],
['A2', 'B1', ['A6', 'A7']]]