Как получить индекс в цикле 'for'?
Как получить индекс при переборе последовательности с помощью цикла for
?
У меня есть список xs
, который выглядит следующим образом:
xs = [8, 23, 45]
Я пытаюсь использовать цикл for
, чтобы перебрать элементы списка и вывести их с соответствующими индексами. Пример кода, который я использую:
for x in xs:
print("item #{} = {}".format(index, x))
Однако, как вы можете заметить, переменная index
в этом коде не определена, и я не знаю, как правильно получать индекс при итерации по списку.
Хотелось бы получить следующий вывод:
item #1 = 8
item #2 = 23
item #3 = 45
Как мне это сделать?
5 ответ(ов)
В Python достаточно просто начать счёт с 1
, а не с 0
. Для этого вы можете использовать параметр start
в функции enumerate()
. Вот как это можно сделать:
for index, item in enumerate(iterable, start=1):
print index, item # Используется для печати в Python < 3.x
print(index, item) # Переходите на print() после 3.x+
Таким образом, при каждом итерации index
будет начинаться с 1
, что может быть полезно в некоторых случаях.
Проверено на Python 3.12
Вот двенадцать примеров того, как можно получить доступ к индексам и соответствующим элементам массива, используя циклы for, циклы while и некоторые функции для итерации. Обратите внимание, что индексы массива по умолчанию всегда начинаются с нуля (см. пример 4
, чтобы изменить это).
1. Итерирование элементов с помощью счетчика и оператора +=
.
items = [8, 23, 45, 12, 78]
counter = 0
for value in items:
print(counter, value)
counter += 1
Результат:
# 0 8
# 1 23
# 2 45
# 3 12
# 4 78
2. Итерирование элементов с использованием встроенной функции enumerate()
.
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)
3. Получение элементов списка и их индексов отдельно.
items = [8, 23, 45, 12, 78]
for index, value in enumerate(items):
print("index", index, "for value", value)
Результат:
# 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
4. Вы можете изменить значение index
на любое начальное значение.
items = [8, 23, 45, 12, 78]
for i, item in enumerate(items, start=100):
print(i, item)
Результат:
# 100 8
# 101 23
# 102 45
# 103 12
# 104 78
5. Автоматическая инкрементация счетчика с помощью методов range(len(...))
.
items = [8, 23, 45, 12, 78]
for i in range(len(items)):
print("Index:", i, "Value:", items[i])
Результат:
# ('Index:', 0, 'Value:', 8)
# ('Index:', 1, 'Value:', 23)
# ('Index:', 2, 'Value:', 45)
# ('Index:', 3, 'Value:', 12)
# ('Index:', 4, 'Value:', 78)
6. Использование цикла for
внутри функции.
items = [8, 23, 45, 12, 78]
def enum(items, start=0):
counter = start
for value in items:
print(counter, value)
counter += 1
enum(items)
Результат:
# 0 8
# 1 23
# 2 45
# 3 12
# 4 78
7. Конечно, нельзя забывать про цикл while
.
items = [8, 23, 45, 12, 78]
counter = 0
while counter < len(items):
print(counter, items[counter])
counter += 1
Результат:
# 0 8
# 1 23
# 2 45
# 3 12
# 4 78
8. Использование оператора yield
, возвращающего объект-генератор.
def createGenerator():
items = [8, 23, 45, 12, 78]
for (j, k) in enumerate(items):
yield (j, k)
generator = createGenerator()
for i in generator:
print(i)
Результат:
# (0, 8)
# (1, 23)
# (2, 45)
# (3, 12)
# (4, 78)
9. Встраивание выражения с циклом for
и lambda
.
items = [8, 23, 45, 12, 78]
xerox = lambda upperBound: [(i, items[i]) for i in range(0, upperBound)]
print(xerox(5))
Результат:
# [(0, 8), (1, 23), (2, 45), (3, 12), (4, 78)]
10. Итерирование сразу по двум спискам с использованием функции zip()
.
items = [8, 23, 45, 12, 78]
indices = []
for index in range(len(items)):
indices.append(index)
for item, index in zip(items, indices):
print("{}: {}".format(index, item))
Результат:
# 0: 8
# 1: 23
# 2: 45
# 3: 12
# 4: 78
11. Итерирование по двум спискам с циклом while
и методами iter()
и next()
.
items = [8, 23, 45, 12, 78]
indices = range(len(items))
iterator1 = iter(indices)
iterator2 = iter(items)
try:
while True:
i = next(iterator1)
element = next(iterator2)
print(i, element)
except StopIteration:
pass
Результат:
# 0 8
# 1 23
# 2 45
# 3 12
# 4 78
12. Также можно итерировать элементы списка внутри статического метода класса.
items = [8, 23, 45, 12, 78]
class ElementPlus:
@staticmethod # декоратор
def indexForEachOfMy(iterable):
for pair in enumerate(iterable):
print(pair)
ElementPlus.indexForEachOfMy(items)
Результат:
# (0, 8)
# (1, 23)
# (2, 45)
# (3, 12)
# (4, 78)
Конечно! Вот перевод вашего кода на русский язык с комментариями для пользователей, которые могут задавать вопросы на StackOverflow:
for i in range(len(ints)):
print(i, ints[i]) # функция print обновлена для использования в Python 3.x+
Это цикл for
, который перебирает индексы списка ints
. В каждой итерации он выводит индекс i
и соответствующий элемент списка ints[i]
. Не забудьте, что в Python 3.x функция print
должна вызываться с круглыми скобками.
Как это принято в Python, существует несколько способов решения этой задачи. В примерах будем исходить из того, что lst = [1, 2, 3, 4, 5]
.
- Использование
enumerate
(считается наиболее идиоматичным)
for index, element in enumerate(lst):
# Здесь выполняйте необходимые действия
По моему мнению, это также самый безопасный вариант, поскольку вероятность бесконечной рекурсии исключена. Оба значения, элемент и его индекс, хранятся в переменных, и нет необходимости писать дополнительный код для доступа к элементу.
- Создание переменной для хранения индекса (с использованием
for
)
for index in range(len(lst)): # или xrange
# Вам придется написать дополнительный код для получения элемента
- Создание переменной для хранения индекса (с использованием
while
)
index = 0
while index < len(lst):
# Вам придется написать дополнительный код для получения элемента
index += 1 # избегаем бесконечной рекурсии
- Всегда есть другой способ
Как уже было объяснено ранее, есть и другие способы решения этой задачи, которые не были упомянуты здесь, и они могут подойти лучше в других ситуациях. Например, использование itertools.chain
в сочетании с for
. Он лучше справляется с вложенными циклами по сравнению с другими примерами.
В этом примере мы рассматриваем два способа перебора элементов списка ints
в Python: традиционный (старомодный) способ с использованием цикла for
и способ с использованием генератора списков (list comprehension).
Старомодный способ:
for ix in range(len(ints)):
print(ints[ix])
Здесь мы используем range(len(ints))
, чтобы получить индексы списка ints
, и затем в каждой итерации выводим элемент по этому индексу.
Способ с использованием генератора списков:
[(ix, ints[ix]) for ix in range(len(ints))]
Этот подход создает новый список, состоящий из кортежей, где каждый кортеж содержит индекс и соответствующий элемент списка 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)
Таким образом, использование генераторов списков позволяет создавать более компактный и читаемый код, особенно когда необходимо сформировать новый список на основе существующего.
Как получить последний элемент списка?
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Диапазон букв в Python
Нахождение среднего значения списка
Вывод списка в обратном порядке с помощью функции range()