Доступ к индексу в циклах 'for'

python loops list


Как получить доступ к индексу в for цикла , как в следующем?

ints = [8, 23, 45, 12, 78]
for i in ints:
    print('item #{} = {}'.format(???, i))

Я хочу получить этот результат:

item #1 = 8
item #2 = 23
item #3 = 45
item #4 = 12
item #5 = 78

Когда я перебираю цикл с помощью цикла for , как мне получить доступ к индексу цикла, в данном случае от 1 до 5?




Answer 1 Mike Hordecki


Использование дополнительной переменной состояния,такой как индексная переменная (которую вы обычно используете в таких языках,как C или PHP),считается непитоническим.

Лучшим вариантом является использование встроенной функции enumerate() , доступной как в Python 2, так и в 3:

for idx, val in enumerate(ints):
    print(idx, val)

Проверьте PEP 279 для получения дополнительной информации.




Answer 2 Aaron Hall


Используя a for loop,как в этом случае получить доступ к индексу цикла от 1 до 5?

Используйте enumerate , чтобы получить индекс с элементом во время итерации:

for index, item in enumerate(items):
    print(index, item)

И обратите внимание,что индексы Python начинаются с нуля,так что вы получите от 0 до 4 с вышеуказанным.Если хочешь посчитать от 1 до 5,сделай это:

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

а иногда и более часто (но однозначно)встречается в Питоне:

for index in range(len(items)):
    print(index, items[index])

Использовать функцию перечисления

Функция enumerate Python уменьшает визуальный беспорядок, скрывая учет индексов и инкапсулируя итерируемое в другой итерируемый объект ( объект enumerate ), который дает кортеж из двух элементов индекса и элемент, который будет обеспечивать исходная итерация. Это выглядит так:

for index, item in enumerate(items, start=0):   # default is zero
    print(index, item)

Этот пример кода довольно хорошо является каноническим примером различия между кодом, который является идиоматическим для Python, и кодом, который не является таковым. Идиоматический код является сложным (но не сложным) Python, написанным так, как он был предназначен для использования. Разработчики языка ожидают идиоматического кода, что означает, что обычно этот код не только более читабелен, но и более эффективен.

Получить счет

Даже если вам не нужны индексы на ходу, но вам нужно количество итераций (иногда желательно), вы можете начать с 1 , а последним числом будет ваш счет.

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

Conclusion

  • Питоновые индексы начинаются с нуля
  • Чтобы получить эти индексы из итерабельного файла в процессе итераций,используйте функцию перечисления
  • Использование перечисления идиоматическим образом (наряду с распаковкой кортежа)создает более читабельный и удобный в обслуживании код:

Так сделай это:

for index, item in enumerate(items, start=0):   # Python indexes start at zero
    print(index, item)



Answer 3 A.J.


Начать с 1 , отличного от 0 , довольно просто :

for index, item in enumerate(iterable, start=1):
   print index, item

Note

Важный совет, хотя и немного вводящий в заблуждение, так как здесь index будет tuple (idx, item) . Хорошо пойти.




Answer 4 David Hanak


for i in range(len(ints)):
   print i, ints[i]



Answer 5 Charitoo


Как правило, в Python есть несколько способов сделать это. Во всех примерах предположим: lst = [1, 2, 3, 4, 5]

1. Использование перечисления ( считается наиболее идиоматическим )

for index, element in enumerate(lst):
    # do the things that need doing here

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

2. Создание переменной для хранения индекса ( используется for )

for index in range(len(lst)):   # or xrange
    # you will have to write extra code to get the element

3. Создание переменной для хранения индекса ( используя while )

index = 0
while index < len(lst):
    # you will have to write extra code to get the element
    index += 1  # escape infinite recursion

4.Всегда есть другой способ

Как объяснялось ранее, есть другие способы сделать это, которые не были объяснены здесь, и они могут даже применить больше в других ситуациях. например, используя itertools.chain с for. Он обрабатывает вложенные циклы лучше, чем другие примеры.