2016-10-11 2 views
2

Я написал код, который использует перечисление для циклического перебора по списку.python продолжает цикл из определенного индекса

for index, item in enumerate(list[start_idx:end_idx]) 
    print('index [%d] item [%s]'%(str(index), item)) 

Элемент в списке - это просто строки. Иногда я не хочу перечислять весь список, иногда я нарезаю список, делаю разные вещи.

Часть, с которой у меня возникают проблемы, - это функция перечисления python.

документы говорят, что вы можете сделать:

for index, item in enumerate(list, start_index): 
    print(str(index)) 

приведенный выше код не делать то, что я ожидал. Я, хотя перечисление начнется в стартовом положении и остановится в конце, но это не так.

Я написал небольшую программу, и она действительно срабатывает.

>>> for i, x in enumerate(range(0,20),start=4): 
...  print(str(i)+'\t'+str(x)) 
... 
4 0 
5 1 
6 2 
7 3 
8 4 
9 5 
10 6 
11 7 
12 8 
13 9 
14 10 
15 11 
16 12 
17 13 
18 14 
19 15 
20 16 
21 17 
22 18 
23 19 

Я бы ожидал, что перечисление начнется с индекса 4 и до конца. Таким образом, он получит диапазон 4-19, но он, кажется, только начинает индексировать, но все же выполняет итерацию с 0-19.

Вопрос: Есть ли способ сделать цикл итерации, начинающийся с определенного индекса в python?

Мой ожидаемый результат будет

>>> for i, x in enumerate(range(0,20),start=4): 
...  print(str(i)+'\t'+str(x)) 
... 
4 0 # skip 
5 1 # until 
6 2 # this 
7 3 # item 
8 4 
9 5 
10 6 
11 7 
12 8 
13 9 
14 10 
15 11 
16 12 
17 13 
18 14 
19 15 
20 16 
21 17 
22 18 
23 19 

вместо запуска индекса на начальную позицию предоставить.

+1

Параметр 'start' аргумент, я бы сказал, косметический. Обычно полезно, когда вы хотите начать отсчет с 1, а не по умолчанию 0 –

+0

Кстати: я понял, что есть немного запаха кода, что вы здесь делаете. Вам не нужно «перечислять», потому что это означает, что вы изменяете элементы списка и устанавливаете их на место. Если вы имеете дело со списком статически, вам не нужно вообще управлять индексами и просто перебирать фрагменты. – kojiro

ответ

2

На самом деле, если вы получили range объект, это не имеет большого значения, чтобы сделать отрезок от него, потому что range(n)[:4] по-прежнему range объект (как @MosesKoledoye упомянул, что это функция Python 3). Но если у вас есть список, ради создания нового списка вы можете выбрать itertools.islice, он вернет итератор.

from itertools import islice 
for index, item in enumerate(islice(range(20), 4, None)): 
    print(index, item) 

Выход

0 4 
1 5 
2 6 
3 7 
4 8 
... 
+0

* 'range (n) [: 4]' все еще объект диапазона * применим только к Python 3 –

+0

@MosesKoledoye вы правы, я упомянул об этом в ответ. –

+0

Я немного изменил это; для индекса, item в перечислении (islice (диапазон (20), 4, None), 4); что сделает бот начальным индексом 4, а также – user1610950

0

Вы можете сделать:

for index, item in enumerate(list[4:]): 
    print(str(index)) 
+0

Если вы это сделаете, индексы списка не будут совпадать с выводом перечисления. – kojiro

+0

@kojiro, то вы можете сделать 'for index, item in enumerate (list [4:], 4):' – JMat

1

Параметр enumeratestart не имеет ничего общего с тем, что элементы итерации выбраны. Он просто сообщает, с какого числа следует начинать.

>>> list(enumerate(range(3))) 
[(0, 0), (1, 1), (2, 2)] 
>>> list(enumerate(range(3), 1)) 
[(1, 0), (2, 1), (3, 2)] 

Если вы хотите начать с определенного индекса, вам необходимо предоставить стартовый аргумент иslice:

for i, v in enumerate(alist[4:], 4): 
    ... 
Смежные вопросы