Используя цикл for, как мне получить доступ к индексу цикла, от 1 до 5 в этом случае?
Используйте enumerate
, чтобы получить индекс с элементом при итерации:
for index, item in enumerate(items):
print(index, item)
Обратите внимание, что индексы Python начинаются с нуля, поэтому вы получите от 0 до 4 с указанным выше. Если вам нужен счет от 1 до 5, сделайте следующее:
count = 0 # in case items is empty and you need it after the loop
for count, item in enumerate(items, start=1):
print(count, item)
Унидиоматический поток управления
То, что вы просите, является питоническим эквивалентом следующего алгоритма, который будет использовать большинство программистов языков нижнего уровня:
index = 0 # Python's indexing starts at zero
for item in items: # Python's for loops are a "for each" loop
print(index, item)
index += 1
Или на языках, в которых нет цикла для каждого:
index = 0
while index < len(items):
print(index, items[index])
index += 1
или иногда чаще (но неидиоматически) в Python:
for index in range(len(items)):
print(index, items[index])
Используйте функцию перечисления
Функция Python enumerate
уменьшает визуальный беспорядок, скрывая учет индексов и инкапсулируя итерируемый объект в другой итерируемый объект (объект enumerate
), который дает двухэлементный кортеж индекса и элемент, который предоставит исходная итерация. Это выглядит так:
for index, item in enumerate(items, start=0): # default is zero
print(index, item)
Этот пример кода довольно хорошо является каноническим примером разницы между кодом, который является идиоматическим для Python, и кодом, который не является таковым. Идиоматический код - это сложный (но не сложный) Python, написанный так, как он был предназначен для использования. Разработчики языка ожидают идиоматического кода, а это означает, что обычно этот код не только более читабелен, но и более эффективен.
Получение счетчика
Даже если вам не нужны индексы на ходу, но вам нужен подсчет итераций (иногда желательно), вы можете начать с 1
, и окончательное число будет вашим счетчиком.
count = 0 # in case items is empty
for count, item in enumerate(items, start=1): # default is zero
print(item)
print('there were {0} items printed'.format(count))
Счетчик, кажется, больше того, о чем вы собираетесь просить (в отличие от индекса), когда вы сказали, что хотите от 1 до 5.
Разборка - пошаговое объяснение
Чтобы разбить эти примеры, скажем, у нас есть список элементов, которые мы хотим перебрать с индексом:
items = ['a', 'b', 'c', 'd', 'e']
Теперь мы передаем эту итерацию для перечисления, создавая объект перечисления:
enumerate_object = enumerate(items) # the enumerate object
Мы можем извлечь первый элемент из этой итерации, который мы получили бы в цикле с функцией next
:
iteration = next(enumerate_object) # first iteration from enumerate
print(iteration)
И мы видим, что получаем кортеж из 0
, первый индекс, и 'a'
, первый элемент:
(0, 'a')
мы можем использовать то, что называется «распаковка последовательности», чтобы извлечь элементы из этого двухкортежа:
index, item = iteration
# 0, 'a' = (0, 'a') # essentially this.
, и когда мы проверяем index
, мы обнаруживаем, что он относится к первому индексу, 0, а item
относится к первому элементу, 'a'
.
>>> print(index)
0
>>> print(item)
a
Заключение
- Индексы Python начинаются с нуля
- Чтобы получить эти индексы из итерации по мере выполнения итерации, используйте функцию перечисления
- Использование enumerate идиоматическим способом (вместе с распаковкой кортежей) создает код, который становится более читабельным и удобным в обслуживании:
Так сделайте это:
for index, item in enumerate(items, start=0): # Python indexes start at zero
print(index, item)
Обратите внимание, что индексы в python начинаются с 0, поэтому индексы для вашего примера списка от 0 до 4, а не от 1 до 5
@JoanVenge, это отличный вопрос, который у меня был МНОГО РАЗ. И в приведенном выше комментарии говорится, что он основан на нулевом индексе (так, мы, люди, считаем от 1 до 3 как 1,2,3, но компьютеры считаются как 0,1,2 (поэтому размер 3, например, равен [0,1 , 2] (0 считается как 1)) И ответы на эти вопросы ниже тоже великолепны. Спасибо за это!