Создание сгруппированных вложенных списков
Есть следующий список со списками:
list1 = [['Клиент 1', 'Товар 1', 100, 200], ['Клиент 2', 'Товар 2', 50, 100], ['Клиент 3', 'Товар 3', 200, 300], ['Клиент 1', 'Товар 1', 20, 50], ['Клиент 2', 'Товар 2', 60, 60]]
Хочу получить сгруппированный список по первому (Клиент) и второму (Товар) элементу во вложенном списке в виде ниже. 3 и 4 элементы вложенного списка должны быть просуммированы.
result = [['Клиент 1', 'Товар 1', 120, 250], ['Клиент 2', 'Товар 2', 110, 160], ['Клиент 3', 'Товар 3', 200, 300]]
Пробовал код ниже, выдает ошибку:
from itertools import groupby
from operator import itemgetter
list1 = [['Клиент 1', 'Товар 1', 100, 200], ['Клиент 2', 'Товар 2', 50, 100], ['Клиент 3', 'Товар 3', 200, 300], ['Клиент 1', 'Товар 1', 20, 50], ['Клиент 2', 'Товар 2', 60, 60]]
result = [[cl, pr, sum(map(itemgetter(2), qty1)), sum(map(itemgetter(3), qty2))] for cl, pr, qty1, qty2 in groupby(list1, itemgetter(0))]
print(result)
Подскажите, как сгруппировать вложенные списки.
Ответы (2 шт):
Автор решения: whizz169
→ Ссылка
Можно попробовать так, если не особо важен формат вывода
import pandas as pd
list1 = [['Клиент 1', 'Товар 1', 100, 200],
['Клиент 2', 'Товар 2', 50, 100],
['Клиент 3', 'Товар 3', 200, 300],
['Клиент 1', 'Товар 1', 20, 50],
['Клиент 2', 'Товар 2', 60, 60]]
df = pd.DataFrame(list1)
result = df.groupby([0, 1]).sum().reset_index()
print(result)
вывод:
0 1 2 3
0 Клиент 1 Товар 1 120 250
1 Клиент 2 Товар 2 110 160
2 Клиент 3 Товар 3 200 300
Автор решения: MiniMax
→ Ссылка
Можно использовать словарь с ключами типа (клиент, товар) для группировки (кортеж может быть использован в качестве ключа словаря).
def group(lst):
groups = {}
for client, product, third, fourth in lst:
groups.setdefault((client, product), [0, 0])
groups[(client, product)][0] += third
groups[(client, product)][1] += fourth
return groups
list1 = [
['Клиент 1', 'Товар 1', 100, 200],
['Клиент 2', 'Товар 2', 50, 100],
['Клиент 3', 'Товар 3', 200, 300],
['Клиент 1', 'Товар 1', 20, 50],
['Клиент 2', 'Товар 2', 60, 60]
]
# Переделываем словарь в двумерный список
result = [[*key, *value] for key, value in group(list1).items()]
from pprint import pprint
pprint(result)
Функцию group можно доработать для произвольного количества суммируемых полей:
def group(lst):
groups = {}
for client, product, *others in lst:
groups.setdefault((client, product), [0] * len(others))
for idx, val in enumerate(others):
groups[(client, product)][idx] += val
return groups
Output
[['Клиент 1', 'Товар 1', 120, 250],
['Клиент 2', 'Товар 2', 110, 160],
['Клиент 3', 'Товар 3', 200, 300]]