Добавление элемента в начало списка

Есть список со списками, первый список имеет максимальный размер:

inp = [
    ['A1', 'B1', 'C1', 'D1', 'E1']
    ['C2', 'D2', 'E2']
    ['D3', 'E3']
    ['A4', 'B4', 'C4', 'D4', 'E4']
    ['C5', 'D5', 'E5']
    ['D6', 'E6']
    ['C7', 'D7', 'E7']
]

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

out = [
    ['A1', 'B1', 'C1', 'D1', 'E1']
    ['A1', 'B1', 'C2', 'D2', 'E2']
    ['A1', 'B1', 'C2', 'D3', 'E3']
    ['A4', 'B4', 'C4', 'D4', 'E4']
    ['A4', 'B4', 'C5', 'D5', 'E5']
    ['A4', 'B4', 'C5', 'D6', 'E6']
    ['A4', 'B4', 'C7', 'D7', 'E7']
]

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


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

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

окончательный код:

inp = [
    ['A1', 'B1', 'C1', 'D1', 'E1'],
    ['C2', 'D2', 'E2'],
    ['D3', 'E3'],
    ['A4', 'B4', 'C4', 'D4', 'E4'],
    ['C5', 'D5', 'E5'],
    ['D6', 'E6'],
    ['C7', 'D7', 'E7']
]

# определить максимальный размер строк
max_len = len(max(inp, key=len))

# сформировать хранилище добавочных элементов
storage = [''] * max_len

# добавить новые элементы
for obj in inp:
    # вычислить кол-во элементов, которые требуется добавить
    new_len = max_len - len(obj)

    # добавить недостающие элементы
    obj[:] = storage[:new_len] + obj

    # обновить хранилище
    storage = obj

print(*inp, sep="\n")

первый вариант

inp = [
    ['A1', 'B1', 'C1', 'D1', 'E1'],
    ['C2', 'D2', 'E2'],
    ['D3', 'E3'],
    ['A4', 'B4', 'C4', 'D4', 'E4'],
    ['C5', 'D5', 'E5'],
    ['D6', 'E6'],
    ['C7', 'D7', 'E7']
]

# определить максимальный размер строк
max_len = len(max(inp, key=len))

# сформировать хранилище добавочных элементов
storage = [''] * max_len

# добавить новые элементы
for obj in inp:
    # вычислить кол-во элементов, которые требуется добавить
    new_len = max_len - len(obj)

    # добавить недостающие элементы
    for index in range(new_len):
        obj.insert(0, storage[new_len - index - 1])

    # обновить хранилище
    storage = obj

print(*inp, sep="\n")

чуть другой подход (не знаю какой лучше, но второй чуть короче и без явного цикла):

# добавить новые элементы
for index, obj in enumerate(inp):
    # вычислить кол-во элементов, которые требуется добавить
    new_len = max_len - len(obj)

    # добавить недостающие элементы
    inp[index] = storage[:new_len] + obj

    # обновить хранилище
    storage = inp[index]
→ Ссылка
Автор решения: vp_arth
inp = [
    ['A1', 'B1', 'C1', 'D1', 'E1'],
    ['C2', 'D2', 'E2'],
    ['D3', 'E3'],
    ['A4', 'B4', 'C4', 'D4', 'E4'],
    ['C5', 'D5', 'E5'],
    ['D6', 'E6'],
    ['C7', 'D7', 'E7'],
]

pattern = inp[0]
for i, l in enumerate(inp[1:]):
    replacement = []
    for j, e in enumerate(pattern): 
        expected = f'{e[0]}{i+2}'
        replacement.append(expected if expected in l else e)
    l[:] = replacement
    pattern = l

for l in inp:
    print(l)
→ Ссылка
Автор решения: extrn
import itertools

def complement(x, y):
    return x[:-len(y)] + y or x

inp = [
    ['A1', 'B1', 'C1', 'D1', 'E1'],
    ['C2', 'D2', 'E2'],
    ['D3', 'E3'],
    ['A4', 'B4', 'C4', 'D4', 'E4'],
    ['C5', 'D5', 'E5'],
    ['D6', 'E6'],
    ['C7', 'D7', 'E7'],
]

out = list(itertools.accumulate(inp, complement))
→ Ссылка
Автор решения: strawdog
import pandas as pd

inp = [
    ['A1', 'B1', 'C1', 'D1', 'E1'],
    ['C2', 'D2', 'E2'],
    ['D3', 'E3'],
    ['A4', 'B4', 'C4', 'D4', 'E4'],
    ['C5', 'D5', 'E5'],
    ['D6', 'E6'],
    ['C7', 'D7', 'E7']
]
res = pd.DataFrame(inp).fillna(method="ffill").values.tolist()

тогда res будет:

[['A1', 'B1', 'C1', 'D1', 'E1'],
 ['C2', 'D2', 'E2', 'D1', 'E1'],
 ['D3', 'E3', 'E2', 'D1', 'E1'],
 ['A4', 'B4', 'C4', 'D4', 'E4'],
 ['C5', 'D5', 'E5', 'D4', 'E4'],
 ['D6', 'E6', 'E5', 'D4', 'E4'],
 ['C7', 'D7', 'E7', 'D4', 'E4']]
→ Ссылка