Я пробовал это, и у меня это сработало:
from itertools import groupby
inList = [
['111127', '20 USt (20%)', '-29.5', '-185.54', '0'],
['111127', '20 USt (20%)', '-29.5', '-185.54', '0'],
['111127', '10 USt (10%)', '-0.77', '-185.54', '0'],
['111127', '10 USt (10%)', '-0.77', '-185.54', '0']]
tmp =[(k, list(v))
for k, v in groupby(sorted(inList,
key = lambda x: (str(x[0]),str(x[3]),str(x[4]))),
lambda x: (str(x[0]),str(x[1]),str(x[3]),str(x[4])))]
tmp
имеет все возможные ключи:
[(('111127', '20 USt (20%)', '-185.54', '0'),
[['111127', '20 USt (20%)', '-29.5', '-185.54', '0'],
['111127', '20 USt (20%)', '-29.5', '-185.54', '0']]),
(('111127', '10 USt (10%)', '-185.54', '0'),
[['111127', '10 USt (10%)', '-0.77', '-185.54', '0'],
['111127', '10 USt (10%)', '-0.77', '-185.54', '0']])]
Затем
listOfKeys = [(key, value) for key, value in tmp]
tmp2 = [(k, list(v))
for k, v in groupby(listOfKeys,
lambda key: (key[0][0], key[0][2], key[0][3]))]
tmp2
группирует похожие ключи (имеют одинаковые x[0]
, x[3]
и x[4]
) и выглядит следующим образом:
[(('111127', '-185.54', '0'),
[(('111127', '20 USt (20%)', '-185.54', '0'),
[['111127', '20 USt (20%)', '-29.5', '-185.54', '0'],
['111127', '20 USt (20%)', '-29.5', '-185.54', '0']]),
(('111127', '10 USt (10%)', '-185.54', '0'),
[['111127', '10 USt (10%)', '-0.77', '-185.54', '0'],
['111127', '10 USt (10%)', '-0.77', '-185.54', '0']])])]
Наконец, outList
дает вам что вы хотели (в соответствии с моим пониманием)
outList = []
for key, subKeys in tmp2:
start = len(outList)
for k, elements in subKeys:
for idx, element in enumerate(elements):
index = start + idx
if (index >= len(outList)):
outList.append([element])
else :
outList[index].append(element)
результат такой, как вы хотите
[[['111127', '20 USt (20%)', '-29.5', '-185.54', '0'],
['111127', '10 USt (10%)', '-0.77', '-185.54', '0']],
[['111127', '20 USt (20%)', '-29.5', '-185.54', '0'],
['111127', '10 USt (10%)', '-0.77', '-185.54', '0']]]
Вы можете поиграть с этим блокнотом Google Colab где все перепробовал