Как мне получить доступ к индексу в цикле 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?

3938
Joan Venge 7 Фев 2009 в 01:47

18 ответов

Лучший ответ

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

Лучше всего использовать встроенную функцию {{X0 }}, доступно в Python 2 и 3:

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

Ознакомьтесь с PEP 279, чтобы узнать больше.

5863
Peter Mortensen 17 Сен 2016 в 10:13

В своем вопросе вы пишете «как мне получить доступ к индексу цикла, в данном случае от 1 до 5?»

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

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

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

for n, a in enumerate(alist):
    print("%d %d" % (n, a))

Выход для вышеупомянутого тогда,

0 1
1 2
2 3
3 4
4 5

Обратите внимание, что индекс начинается с 0. Этот вид индексации распространен среди современных языков программирования, включая Python и C.

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

for n, a in enumerate(alist[1:-1]):
    print("%d %d" % (n, a))

Обратите внимание, что еще раз, выходной индекс работает от 0,

0 2
1 3
2 4

Это подводит нас к переключателю start=n для enumerate(). Это просто смещает индекс, вы можете эквивалентно просто добавить число к индексу внутри цикла.

for n, a in enumerate(alist, start=1):
    print("%d %d" % (n, a))

Для которого выход

1 1
2 2
3 3
4 4
5 5
6
Georgy 22 Май 2019 в 15:10

Если бы я перебрал nums = [1, 2, 3, 4, 5], я бы сделал

for i, num in enumerate(nums, start=1):
    print(i, num)

Или получить длину как l = len(nums)

for i in range(1, l + 1):
    print(i, nums[i])
6
Georgy 22 Май 2019 в 14:58
for i in range(len(ints)):
   print i, ints[i]
88
David Hanak 6 Фев 2009 в 22:49

Вы можете сделать это с помощью этого кода:

ints = [8, 23, 45, 12, 78]
index = 0

for value in (ints):
    index +=1
    print index, value

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

ints = [8, 23, 45, 12, 78]
index = 0

for value in (ints):
    index +=1
    print index, value
    if index >= len(ints)-1:
        index = 0
10
Liam 26 Май 2015 в 10:39

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

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

Запись

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

143
A.J. 25 Июл 2018 в 10:55

Старомодный способ:

for ix in range(len(ints)):
    print ints[ix]

Понимание списка:

[ (ix, ints[ix]) for ix in range(len(ints))]

>>> ints
[1, 2, 3, 4, 5]
>>> for ix in range(len(ints)): print ints[ix]
... 
1
2
3
4
5
>>> [ (ix, ints[ix]) for ix in range(len(ints))]
[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]
>>> lc = [ (ix, ints[ix]) for ix in range(len(ints))]
>>> for tup in lc:
...     print tup
... 
(0, 1)
(1, 2)
(2, 3)
(3, 4)
(4, 5)
>>> 
26
Charlie Martin 6 Фев 2009 в 22:57

Вы также можете попробовать это:

data = ['itemA.ABC', 'itemB.defg', 'itemC.drug', 'itemD.ashok']
x = []
for (i, item) in enumerate(data):
      a = (i, str(item).split('.'))
      x.append(a)
for index, value in x:
     print(index, value)

Выход

0 ['itemA', 'ABC']
1 ['itemB', 'defg']
2 ['itemC', 'drug']
3 ['itemD', 'ashok']
4
Ashok Kumar Jayaraman 7 Фев 2018 в 14:04

Лучшее решение этой проблемы - использовать встроенную функцию Python enumerate .
перечислить вернуть кортеж
первое значение - индекс
Второе значение - элемент массива по этому индексу

In [1]: ints = [8, 23, 45, 12, 78]

In [2]: for idx, val in enumerate(ints):
   ...:         print(idx, val)
   ...:     
(0, 8)
(1, 23)
(2, 45)
(3, 12)
(4, 78)
8
Anurag Misra 24 Авг 2017 в 06:15

Вы можете использовать метод index

ints = [8, 23, 45, 12, 78]
inds = [ints.index(i) for i in ints]

< Сильный > ИЗМЕНИТЬ Подчеркнуто в комментарии, что этот метод не работает, если в ints есть дубликаты, метод ниже должен работать для любых значений в ints:

ints = [8, 8, 8, 23, 45, 12, 78]
inds = [tup[0] for tup in enumerate(ints)]

Или в качестве альтернативы

ints = [8, 8, 8, 23, 45, 12, 78]
inds = [tup for tup in enumerate(ints)]

Если вы хотите получить индекс и значение в ints в виде списка кортежей.

Он использует метод enumerate в выбранном ответе на этот вопрос, но со списком, что делает его быстрее с меньшим количеством кода.

2
PyRsquared 31 Май 2018 в 06:09

Вот что вы получаете, когда получаете доступ к индексу в for циклах:

< Сильный > for i in enumerate(items): print(i)

items = [8, 23, 45, 12, 78]

for i in enumerate(items):
    print("index/value", i)

Результат:

# index/value (0, 8)
# index/value (1, 23)
# index/value (2, 45)
# index/value (3, 12)
# index/value (4, 78)

< Сильный > for i, val in enumerate(items): print(i, val)

items = [8, 23, 45, 12, 78]

for i, val in enumerate(items):
    print("index", i, "for value", val)

Результат:

# index 0 for value 8
# index 1 for value 23
# index 2 for value 45
# index 3 for value 12
# index 4 for value 78

< Сильный > for i, val in enumerate(items): print(i)

items = [8, 23, 45, 12, 78]

for i, val in enumerate(items):
    print("index", i)

Результат:

# index 0
# index 1
# index 2
# index 3
# index 4
7
Andy 6 Фев 2020 в 20:23

Согласно этому обсуждению: http://bytes.com/topic/python / ответы / 464012 -объекты - список - индекс

Итерация счетчика циклов

Текущая идиома для циклического перемещения по индексам использует встроенную функцию range:

for i in range(len(sequence)):
    # work with index i

Циклы по элементам и индексам могут быть достигнуты либо с помощью старой идиомы, либо с помощью новой встроенной функции zip:

for i in range(len(sequence)):
    e = sequence[i]
    # work with index i and element e

Или

for i, e in zip(range(len(sequence)), sequence):
    # work with index i and element e

Через http://www.python.org/dev/peps/pep-0212/

11
Georgy 22 Май 2019 в 14:29

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

for x in range(0, 5):

Имейте в виду, что я написал от 0 до 5, потому что цикл останавливается на один номер до макс. :)

Чтобы получить значение индекса используйте

list[index]
13
Thorsten S. 25 Май 2015 в 23:05

Это служит цели достаточно хорошо:

list1 = [10, 'sumit', 43.21, 'kumar', '43', 'test', 3]
for x in list1:
    print('index:', list1.index(x), 'value:', x)
0
Challenger5 15 Май 2018 в 05:41

Если в списке нет повторяющихся значений:

for i in ints:
    indx = ints.index(i)
    print(i, indx)
5
Georgy 22 Май 2019 в 15:02

Чтобы напечатать кортеж (index, value) в понимании списка, используя цикл for:

ints = [8, 23, 45, 12, 78]
print [(i,ints[i]) for i in range(len(ints))]

Выход:

[(0, 8), (1, 23), (2, 45), (3, 12), (4, 78)]
0
lola 24 Апр 2018 в 10:53

Как правило, в 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. Он обрабатывает вложенные циклы лучше, чем другие примеры.

45
jamylak 10 Фев 2018 в 20:05

Используя цикл for, как мне получить доступ к индексу цикла, от 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)

Unidiomatic контроль потока

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

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

Или в языках, где нет цикла for-each:

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 функция 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

Вывод

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

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

for index, item in enumerate(items, start=0):   # Python indexes start at zero
    print(index, item)
759
Aaron Hall 9 Мар 2018 в 15:37