55

Как получить индекс в цикле 'for'?

14

Как получить индекс при переборе последовательности с помощью цикла 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 ответ(ов)

2

В 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, что может быть полезно в некоторых случаях.

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)
1

Конечно! Вот перевод вашего кода на русский язык с комментариями для пользователей, которые могут задавать вопросы на StackOverflow:

for i in range(len(ints)):
   print(i, ints[i])  # функция print обновлена для использования в Python 3.x+

Это цикл for, который перебирает индексы списка ints. В каждой итерации он выводит индекс i и соответствующий элемент списка ints[i]. Не забудьте, что в Python 3.x функция print должна вызываться с круглыми скобками.

0

Как это принято в Python, существует несколько способов решения этой задачи. В примерах будем исходить из того, что lst = [1, 2, 3, 4, 5].

  1. Использование enumerate (считается наиболее идиоматичным)

for index, element in enumerate(lst):
    # Здесь выполняйте необходимые действия

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

  1. Создание переменной для хранения индекса (с использованием for)

for index in range(len(lst)):   # или xrange
    # Вам придется написать дополнительный код для получения элемента
  1. Создание переменной для хранения индекса (с использованием while)

index = 0
while index < len(lst):
    # Вам придется написать дополнительный код для получения элемента
    index += 1  # избегаем бесконечной рекурсии
  1. Всегда есть другой способ

Как уже было объяснено ранее, есть и другие способы решения этой задачи, которые не были упомянуты здесь, и они могут подойти лучше в других ситуациях. Например, использование itertools.chain в сочетании с for. Он лучше справляется с вложенными циклами по сравнению с другими примерами.

0

В этом примере мы рассматриваем два способа перебора элементов списка 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)

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь