склеить списки по индексу

lst = [['D  004660M2   ', 'клей 2-ком', 'KOM', '2.00', 'PDV20', '1135.00', '2270.00', 'BC', '30.00', '53791', '532', 'DE', 'Alles', 'VW', 'AG', '1', '303', 'VW', 'AG', '3506100098', '\n'],
    ['D  004660M2   ', 'клей 2-ком', 'KOM', '10.00', 'PDV20', '1135.00', '11350.00', 'BC', '30.00', '53916', '499', 'DE', 'Alles', 'VW', 'AG', '1', '303', 'VW', 'AG', '3506100098', '\n'],
    ['D  004660M2   ', 'клей 2-ком', 'KOM', '4.00', 'PDV20', '1135.00', '4540.00', 'BC', '30.00', '53791', '532', 'DE', 'Alles', 'VW', 'AG', '1', '303', 'VW', 'AG', '3506100098', '\n'], 
    ['D  004660M2   ', 'клей 2-ком', 'KOM', '10.00', 'PDV20', '1135.00', '11350.00', 'BC', '30.00', '53919', '499', 'DE', 'Alles', 'VW', 'AG', '1', '303', 'VW', 'AG', '3506100098', '\n'],
    ['D  004660M2   ', 'клей 2-ком', 'KOM', '4.00', 'PDV20', '1135.00', '4540.00', 'BC', '30.00', '53796', '532', 'DE', 'Alles', 'VW', 'AG', '1', '303', 'VW', 'AG', '3506100098', '\n']]

Есть такой список списков, мне нужно склеить их по признаку 9го индекса если они совпадают значит нужно сложить 3й, 6й и 7й индекс все остальные элементы списка вернуть как есть, уже кучу раз переписывал но так и не получилось склеить...


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

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

По ходу действа заносить элементы списка в словарь по ключу равному элементу с индексом 9. И каждый раз проверять, если такой индекс в словаре уже есть, то сложить нужные поля из словаря и списка, и обновить эти данные в словаре. если такого индекса в словаре ещё нет, то добавить. В конце просто взять все значения из словаря.

d = {}
for el in lst:
    if el[9] in d:
        for i in (3,6):
            d[el[9]][i] = str(float(d[el[9]][i]) + float(el[i]))
    else:
        d[el[9]] = el

res = list(d.values())
→ Ссылка
Автор решения: Andy Pavlov

У меня схожий вариант с GrAnd, но несколько в другом ключе. Создаем словарь с ключами по 9-му индексу с нулевым значением, и к нему плюсуем нужные ячейки в цикле. В итоге имеем словарь с ключем по индексу 9 и суммарным значением по ячейкам. Дальше выдаем пару ключ-значение через items().

В переменной idxs храним индексы суммируемых столбцов. Могу предположить, что суммировать надо столбцы не 3, 6, 7, а 3, 5, 6

lst = [['D  004660M2   ', 'клей 2-ком', 'KOM', '2.00', 'PDV20', '1135.00', '2270.00', 'BC', '30.00', '53791', '532', 'DE', 'Alles', 'VW', 'AG', '1', '303', 'VW', 'AG', '3506100098', '\n'],
['D  004660M2   ', 'клей 2-ком', 'KOM', '10.00', 'PDV20', '1135.00', '11350.00', 'BC', '30.00', '53916', '499', 'DE', 'Alles', 'VW', 'AG', '1', '303', 'VW', 'AG', '3506100098', '\n'],
['D  004660M2   ', 'клей 2-ком', 'KOM', '4.00', 'PDV20', '1135.00', '4540.00', 'BC', '30.00', '53791', '532', 'DE', 'Alles', 'VW', 'AG', '1', '303', 'VW', 'AG', '3506100098', '\n'],
['D  004660M2   ', 'клей 2-ком', 'KOM', '10.00', 'PDV20', '1135.00', '11350.00', 'BC', '30.00', '53919', '499', 'DE', 'Alles', 'VW', 'AG', '1', '303', 'VW', 'AG', '3506100098', '\n'],
['D  004660M2   ', 'клей 2-ком', 'KOM', '4.00', 'PDV20', '1135.00', '4540.00', 'BC', '30.00', '53796', '532', 'DE', 'Alles', 'VW', 'AG', '1', '303', 'VW', 'AG', '3506100098', '\n']]

idxs = (3, 5, 6)
comb = dict().fromkeys([v[9] for v in lst], list())
for item in lst:
    comb[item[9]] = [(float(v) + comb[item[9]][iv] if comb.get(item[9])
                      else float(v)) if iv in idxs else v for iv, v in enumerate(item)]

print(*comb.values(), sep='\n')

Вывод:

['D  004660M2   ', 'клей 2-ком', 'KOM', 6.0, 'PDV20', 2270.0, 6810.0, 'BC', '30.00', '53791', '532', 'DE', 'Alles', 'VW', 'AG', '1', '303', 'VW', 'AG', '3506100098', '\n']
['D  004660M2   ', 'клей 2-ком', 'KOM', 10.0, 'PDV20', 1135.0, 11350.0, 'BC', '30.00', '53916', '499', 'DE', 'Alles', 'VW', 'AG', '1', '303', 'VW', 'AG', '3506100098', '\n']
['D  004660M2   ', 'клей 2-ком', 'KOM', 10.0, 'PDV20', 1135.0, 11350.0, 'BC', '30.00', '53919', '499', 'DE', 'Alles', 'VW', 'AG', '1', '303', 'VW', 'AG', '3506100098', '\n']
['D  004660M2   ', 'клей 2-ком', 'KOM', 4.0, 'PDV20', 1135.0, 4540.0, 'BC', '30.00', '53796', '532', 'DE', 'Alles', 'VW', 'AG', '1', '303', 'VW', 'AG', '3506100098', '\n']
→ Ссылка
Автор решения: strawdog
import pandas as pd

df = pd.DataFrame(lst)
df[[3,5,6]] = df[[3,5,6]].astype("float")
df[[3,5,6]] = df.groupby(9)[[3,5,6]].transform('sum')
res = df.values.tolist()

res:

[['D  004660M2   ', 'клей 2-ком', 'KOM', 6.0, 'PDV20', 2270.0, 6810.0, 'BC', '30.00', '53791', '532', 'DE', 'Alles', 'VW', 'AG', '1', '303', 'VW', 'AG', '3506100098', '\n'],
 ['D  004660M2   ', 'клей 2-ком', 'KOM', 10.0, 'PDV20', 1135.0, 11350.0, 'BC', '30.00', '53916', '499', 'DE', 'Alles', 'VW', 'AG', '1', '303', 'VW', 'AG', '3506100098', '\n'],
 ['D  004660M2   ', 'клей 2-ком', 'KOM', 6.0, 'PDV20', 2270.0, 6810.0, 'BC', '30.00', '53791', '532', 'DE', 'Alles', 'VW', 'AG', '1', '303', 'VW', 'AG', '3506100098', '\n'],
 ['D  004660M2   ', 'клей 2-ком', 'KOM', 10.0, 'PDV20', 1135.0, 11350.0, 'BC', '30.00', '53919', '499', 'DE', 'Alles', 'VW', 'AG', '1', '303', 'VW', 'AG', '3506100098', '\n'],
 ['D  004660M2   ', 'клей 2-ком', 'KOM', 4.0, 'PDV20', 1135.0, 4540.0, 'BC', '30.00', '53796', '532', 'DE', 'Alles', 'VW', 'AG', '1', '303', 'VW', 'AG', '3506100098', '\n']]​

или, без дубликатов:

res = df.drop_duplicates().values.tolist()

res:

[['D  004660M2   ', 'клей 2-ком', 'KOM', 6.0, 'PDV20', 2270.0, 6810.0, 'BC', '30.00', '53791', '532', 'DE', 'Alles', 'VW', 'AG', '1', '303', 'VW', 'AG', '3506100098', '\n'],
 ['D  004660M2   ', 'клей 2-ком', 'KOM', 10.0, 'PDV20', 1135.0, 11350.0, 'BC', '30.00', '53916', '499', 'DE', 'Alles', 'VW', 'AG', '1', '303', 'VW', 'AG', '3506100098', '\n'],
 ['D  004660M2   ', 'клей 2-ком', 'KOM', 10.0, 'PDV20', 1135.0, 11350.0, 'BC', '30.00', '53919', '499', 'DE', 'Alles', 'VW', 'AG', '1', '303', 'VW', 'AG', '3506100098', '\n'],
 ['D  004660M2   ', 'клей 2-ком', 'KOM', 4.0, 'PDV20', 1135.0, 4540.0, 'BC', '30.00', '53796', '532', 'DE', 'Alles', 'VW', 'AG', '1', '303', 'VW', 'AG', '3506100098', '\n']]
→ Ссылка