Как перебрать элементы списка с определенной последовательностью?

Есть список:

first_list = [1,2,3,4,5,6,7,8,9]

Как получить вариации типа:

new_list_1 = [1,2,3]
new_list_2 = [2,3,4]
new_list_3 = [3,4,5]

Т.е. нужно, в новом списке, первый элемент удалить и добавить следующий из основного списка. Желательно через генератор сделать.

В реальном рабочем списке элементов = 1000+


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

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

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

first_list = [1,2,3,4,5,6,7,8,9]
new_lists = []
for i in range(len(first_list)-2):
    new_list = [first_list[i], first_list[i+1], first_list[i+2]]
    new_lists.append(new_list)
print(new_lists)

Вывод:

[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8, 9]]

Вы можете использовать срезы (slicing) списка, чтобы создать эти новые списки, не указывая конкретные индексы элементов. Например:

first_list = [1,2,3,4,5,6,7,8,9]
new_lists = []
for i in range(len(first_list)-2):
    new_lists.append(first_list[i:i+3])
print(new_lists)

Результат:

[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8, 9]]

Вы также можете использовать генератор списка и срезы списка, чтобы создать эти новые списки:

first_list = [1,2,3,4,5,6,7,8,9]
new_lists = [first_list[i:i+3] for i in range(len(first_list)-2)]
print(new_lists)

Вывод:

[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8, 9]]
→ Ссылка
Автор решения: Алексей Р

С генератором

first_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]


def gen_lists(lst):
    idx = 0
    while idx < len(lst) - 2:
        yield lst[idx:idx + 3]
        idx += 1


gen = gen_lists(first_list)
new_list_1 = next(gen)
new_list_2 = next(gen)
new_list_3 = next(gen)

print(new_list_1, new_list_2, new_list_3, sep='\n')
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
→ Ссылка