Перебор постепенно увеличивающихся фрагментов от начала списка в python - PullRequest
0 голосов
/ 20 марта 2020

Рассмотрим следующий код, который печатает первые n элементы списка из n = 1..N

lst = [1,2,3,4,5]

for n in range(1, len(lst)+1):
    print(lst[:n])

>>> [1]
>>> [1, 2]
>>> [1, 2, 3]
>>> [1, 2, 3, 4]
>>> [1, 2, 3, 4, 5]

Я ищу версию этого кода в стиле foreach, чтобы избежать немного сбивает с толку range(1, len(lst)+1). Что-то вроде

for sublist in ___(lst):
    print(sublist)

Я уверен, что есть хороший способ сделать это с itertools или что-то, но я ничего не могу найти.

Ответы [ 2 ]

4 голосов
/ 20 марта 2020

Вы должны привыкнуть к виду range () в python, если вы собираетесь манипулировать индексами и индексами (что обычно не очень pythoni c).

Большинство из время, когда есть способ обрабатывать списки, не проходя через индексы.

Это не очень хороший пример, но он иллюстрирует подход, который можно использовать:

lst = [1,2,3,4,5]
def subLists(arr):
    if not arr: return
    for sl in subLists(arr[:-1]): yield sl
    yield arr

output:

for sublist in subLists(lst): 
    print(sublist)

[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4, 5]

Кроме того, вы можете избежать использования crypti c (len (lst)), используя перечисление:

for n,_ in enumerate(lst,1):
    print(lst[:n])

Вы также можете использовать накопление из itertools:

from itertools import accumulate
for s in accumulate([i] for i in lst):
    print(s)
3 голосов
/ 20 марта 2020

Я не думаю, что есть хороший в желаемой форме. Твой путь уже хорош. Один из вариантов, который я могу придумать, это создать их, добавляя по одному элементу за раз.

prefix = []
for x in lst:
    prefix.append(x)
    print(prefix)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...