Как получить индекс в цикле '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)
Таким образом, использование генераторов списков позволяет создавать более компактный и читаемый код, особенно когда необходимо сформировать новый список на основе существующего.
Как получить последний элемент списка?
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Самый быстрый способ проверить наличие значения в списке
Сравнение: генераторы списков против lambda + filter
Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе