Как мне получить доступ к индексу в 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?
Ответы:
Использование дополнительной переменной состояния, такой как индексная переменная (которую вы обычно используете в таких языках, как C или PHP), считается непифоническим.
Лучшим вариантом является использование встроенной функции
enumerate()
, доступной как в Python 2, так и в 3:Проверьте PEP 279 для получения дополнительной информации.
источник
enumerate
несут ли другие накладные расходы?enumerate
.Используйте
enumerate
для получения индекса с элементом во время итерации:И обратите внимание, что индексы Python начинаются с нуля, так что вы получите от 0 до 4 с выше. Если вы хотите считать от 1 до 5, сделайте это:
Unidiomatic контроль потока
То, что вы просите, - это Pythonic-эквивалент следующего: алгоритм, который будет использовать большинство программистов на языках нижнего уровня:
Или в языках, где нет цикла for-each:
или иногда чаще (но неидиоматически) встречается в Python:
Используйте функцию перечисления
enumerate
Функция Python уменьшает визуальный беспорядок, скрывая учет индексов и инкапсулируя итерируемое в другой итерируемыйenumerate
объект ( объект), который дает кортеж из двух элементов индекса и элемент, который будет обеспечивать исходная итерация. Это выглядит так:Этот пример кода довольно хорошо является каноническим примером различия между кодом, который является идиоматическим для Python, и кодом, который не является таковым. Идиоматический код является сложным (но не сложным) Python, написанным так, как он был предназначен для использования. Разработчики языка ожидают идиоматического кода, что означает, что обычно этот код не только более читабелен, но и более эффективен.
Получение подсчета
Даже если вам не нужны индексы по ходу дела, но вам нужно количество итераций (иногда желательных), с которых вы можете начать,
1
и окончательным числом будет ваш счет.Счет, кажется, больше того, что вы намереваетесь просить (в отличие от индекса), когда вы сказали, что хотите от 1 до 5.
Разбивка - пошаговое объяснение
Чтобы разбить эти примеры, скажем, у нас есть список элементов, которые мы хотим перебрать с индексом:
Теперь мы передаем эту итерацию для перечисления, создавая объект перечисления:
Мы можем извлечь первый элемент из этой итерации, который мы бы запустили в цикл с помощью
next
функции:И мы видим, что мы получаем кортеж
0
, первый индекс и'a'
первый элемент:мы можем использовать то, что называется « распаковка последовательности », чтобы извлечь элементы из этого двухкорпусного:
и когда мы исследуем
index
, мы находим , что относится к первому индексу, 0, иitem
относится к первому пункту'a'
.Вывод
Так что сделайте это:
источник
items
он пуст?[1406, 1409]
. Если я печатаю на консоль, используяprint(legData)
, вывод будет [1406,1409] . Однако, если я попытаюсь разобрать отдельные значения списка, напримерfor idx, xLeg in enumerate(legData):
print(idx, xLeg)
, получится вывод отдельных целых чисел, таких как [, 1, 4, 0, 6 и т. Д., С индексами 0, 1, 2, 3, 4 и т. д. (да, квадратные скобки и запятая также выводятся, как если бы они были частью самих данных ). Что здесь не так?Это довольно просто, чтобы начать с
1
другого, чем0
:Запись
Важный намек, хотя и немного вводящий в заблуждение, т.к.
index
будетtuple
(idx, item)
здесь. Хорошо пойти.источник
index, item
just,index
вводит в заблуждение. Просто используйтеfor index, item in enumerate(ints)
.источник
xrange
для pre-3.0.enumerate
спасает любую логику; Вы все еще должны выбрать, какой объект индексироватьi
, нет?Как правило, в Python есть несколько способов сделать это. Во всех примерах предполагается:
lst = [1, 2, 3, 4, 5]
1. Использование перечисления ( считается наиболее идиоматическим )
На мой взгляд, это также самый безопасный вариант, потому что исключена вероятность перехода к бесконечной рекурсии. И элемент, и его индекс хранятся в переменных, и нет необходимости писать дополнительный код для доступа к элементу.
2. Создание переменной для хранения индекса ( использование
for
)3. Создание переменной для хранения индекса ( использование
while
)4. Всегда есть другой способ
Как объяснялось ранее, есть другие способы сделать это, которые не были объяснены здесь, и они могут даже применить больше в других ситуациях. например, используя
itertools.chain
с для. Он обрабатывает вложенные циклы лучше, чем другие примеры.источник
Старомодный способ:
Понимание списка:
источник
Самый быстрый способ получить доступ к индексам списка в цикле в Python 2.7 - это использовать метод range для небольших списков и метод enumerate для списков среднего и большого размера.
Пожалуйста, ознакомьтесь с различными подходами, которые можно использовать для перебора списка и значения индекса доступа и их метрик производительности (которые, я полагаю, будут полезны для вас) в примерах кода ниже:
Смотрите показатели производительности для каждого метода ниже:
В результате использование
range
метода является самым быстрым из списка с 1000 наименованиями. Для списка с размером> 10 000 пунктовenumerate
является победителем.Добавив несколько полезных ссылок ниже:
В чем разница между функциями range и xrange в Python 2.X?
Что быстрее для цикла с использованием перечисления или для цикла с использованием xrange в Python?
диапазон (len (список)) или перечислить (список)?
источник
Прежде всего, индексы будут от 0 до 4. Языки программирования начинают считать с 0; не забывайте об этом, иначе вы встретите исключение индекса за пределами границ. Все, что вам нужно в цикле for, это переменная, считающая от 0 до 4, примерно так:
Имейте в виду, что я написал от 0 до 5, потому что цикл останавливается на один номер до макс. :)
Чтобы получить значение индекса используйте
источник
Вот что вы получаете, когда получаете доступ к индексу в
for
циклах:Результат:
Результат:
Результат:
источник
Согласно этой дискуссии: http://bytes.com/topic/python/answers/464012-objects-list-index
Итерация счетчика циклов
Текущая идиома для зацикливания индексов использует встроенную
range
функцию:Циклы по элементам и индексам могут быть достигнуты либо с помощью старой идиомы, либо с помощью новой
zip
встроенной функции:или
через http://www.python.org/dev/peps/pep-0212/
источник
Вы можете сделать это с помощью этого кода:
Используйте этот код, если вам нужно сбросить значение индекса в конце цикла:
источник
Лучшее решение для этой проблемы является использование перечисления в сборке функции питона.
перечислить возвращаемый кортеж
первое значение является индексом
второе значение является элементом массива с этим индексом
источник
В своем вопросе вы пишете "как мне получить доступ к индексу цикла, от 1 до 5 в этом случае?"
Однако индекс для списка начинается с нуля. Итак, тогда нам нужно знать, действительно ли вам нужен индекс и элемент для каждого элемента в списке, или вы действительно хотите, чтобы числа начинались с 1. К счастью, в Python это легко сделать и тем, и другим.
Во-первых, чтобы уточнить,
enumerate
функция итеративно возвращает индекс и соответствующий элемент для каждого элемента в списке.Выход для вышеупомянутого тогда,
Обратите внимание, что индекс начинается с 0. Этот вид индексации распространен среди современных языков программирования, включая Python и C.
Если вы хотите, чтобы ваш цикл занимал часть списка, вы можете использовать стандартный синтаксис Python для части списка. Например, чтобы перейти от второго элемента в списке до последнего элемента, но не включая последний, вы можете использовать
Обратите внимание, что еще раз, выходной индекс работает от 0,
Это подводит нас к
start=n
переключателюenumerate()
. Это просто смещает индекс, вы можете эквивалентно просто добавить число к индексу внутри цикла.для которого выход
источник
Если бы я повторил,
nums = [1, 2, 3, 4, 5]
я бы сделалИли получить длину как
l = len(nums)
источник
Если в списке нет повторяющихся значений:
источник
enumerate
. Вы должны удалить этот ответ.Вы также можете попробовать это:
Выход
источник
Вы можете использовать
index
методРЕДАКТИРОВАТЬ Подчеркнуто в комментарии, что этот метод не работает, если есть дубликаты
ints
, метод ниже должен работать для любых значений вints
:Или в качестве альтернативы
если вы хотите получить и индекс, и значение в
ints
виде списка кортежей.Он использует метод
enumerate
в выбранном ответе на этот вопрос, но с пониманием списка, что делает его быстрее с меньшим количеством кода.источник
Простой ответ с помощью цикла Loop:
Вывод:
источник
Чтобы напечатать кортеж (индекс, значение) в понимании списка, используя
for
цикл:Вывод:
источник
Это служит цели достаточно хорошо:
источник
index()
будут искать первое вхождениеx
, не упоминая время O ( n ^ 2 ), необходимое для поиска каждого элемента.