Как мне получить доступ к индексу в цикле 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?
18 ответов
Использование дополнительной переменной состояния, такой как индексная переменная (которую вы обычно используете в таких языках, как C или PHP), считается непифоническим.
Лучше всего использовать встроенную функцию {{X0 }}, доступно в Python 2 и 3:
for idx, val in enumerate(ints):
print(idx, val)
Ознакомьтесь с PEP 279, чтобы узнать больше.
В своем вопросе вы пишете «как мне получить доступ к индексу цикла, в данном случае от 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
Если бы я перебрал 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])
for i in range(len(ints)):
print i, ints[i]
Вы можете сделать это с помощью этого кода:
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
Начать его с 1
, отличного от 0
, довольно просто:
for index, item in enumerate(iterable, start=1):
print index, item
Запись
Важный совет, хотя и немного вводящий в заблуждение, поскольку index
будет tuple
(idx, item)
здесь. Хорошо пойти.
Старомодный способ:
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)
>>>
Вы также можете попробовать это:
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']
Лучшее решение этой проблемы - использовать встроенную функцию 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)
Вы можете использовать метод 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
в выбранном ответе на этот вопрос, но со списком, что делает его быстрее с меньшим количеством кода.
Вот что вы получаете, когда получаете доступ к индексу в 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
Согласно этому обсуждению: 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/
Прежде всего, индексы будут от 0 до 4. Языки программирования начинают считать с 0; не забывайте об этом, иначе вы встретите исключение индекса за пределами границ. Все, что вам нужно в цикле for, это переменная, считающая от 0 до 4, примерно так:
for x in range(0, 5):
Имейте в виду, что я написал от 0 до 5, потому что цикл останавливается на один номер до макс. :)
Чтобы получить значение индекса используйте
list[index]
Это служит цели достаточно хорошо:
list1 = [10, 'sumit', 43.21, 'kumar', '43', 'test', 3]
for x in list1:
print('index:', list1.index(x), 'value:', x)
Если в списке нет повторяющихся значений:
for i in ints:
indx = ints.index(i)
print(i, indx)
Чтобы напечатать кортеж (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)]
Как правило, в 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. Он обрабатывает вложенные циклы лучше, чем другие примеры.
Используя цикл 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)
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.