Как получить доступ к значению индекса в цикле 'for'?
Как мне получить доступ к индексу во время итерации по последовательности с помощью for
цикла?
xs = [8, 23, 45]
for x in xs:
print("item #{} = {}".format(index, x))
Желаемый результат:
item #1 = 8
item #2 = 23
item #3 = 45
Переведено автоматически
Ответ 1
Используйте встроенную функцию enumerate()
:
for idx, x in enumerate(xs):
print(idx, x)
Это не по-питоновски - вручную индексировать через for i in range(len(xs)): x = xs[i]
или вручную управлять дополнительной переменной состояния.
Подробнее читайте на PEP 279.
Ответ 2
Используя цикл for, как мне получить доступ к индексу цикла, в данном случае от 1 до 5?
Используйте enumerate
для получения индекса с элементом по мере выполнения итерации:
for index, item in enumerate(items):
print(index, item)
И обратите внимание, что индексы Python начинаются с нуля, поэтому вы получите от 0 до 4 с приведенным выше значением. Если вам нужно количество от 1 до 5, сделайте это:
count = 0 # in case items is empty and you need it after the loop
for count, item in enumerate(items, start=1):
print(count, item)
Одноуровневый поток управления
То, что вы запрашиваете, является питоновским эквивалентом следующего, который является алгоритмом, который использовали бы большинство программистов языков более низкого уровня:
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])
Используйте функцию Enumerate
enumerate
Функция Python уменьшает визуальный беспорядок, скрывая учет индексов и инкапсулируя итерируемый объект в другой итерируемый объект (enumerate
объект), который выдает кортеж из двух элементов, состоящий из индекса и элемента, который предоставил бы исходный итерируемый объект. Это выглядит примерно так:
for index, item in enumerate(items, start=0): # default is zero
print(index, item)
Этот пример кода довольно хорошо является каноническим примером разницы между кодом, который является идиоматичным для Python, и кодом, который таковым не является. Идиоматический код сложен (но не усложнен) Python, написанный так, как он был предназначен для использования. Разработчики языка ожидают, что идиоматический код будет не только более читабельным, но и более эффективным.
Получение количества
Даже если вам не нужны индексы по ходу работы, но вам нужно количество итераций (иногда желательно), вы можете начать с 1
, и конечное число будет вашим количеством.
count = 0 # in case items is empty
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 , создавая объект enumerate:
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 начинаются с нуля
- Чтобы получить эти индексы из итерируемого объекта по мере его повторения, используйте функцию enumerate
- Использование enumerate идиоматическим способом (наряду с распаковкой кортежей) создает код, который более удобочитаем и обслуживаем:
Итак, сделайте это:
for index, item in enumerate(items, start=0): # Python indexes start at zero
print(index, item)
Ответ 3
Запустить его довольно просто с 1
другого, чем 0
:
for index, item in enumerate(iterable, start=1):
print index, item # Used to print in python<3.x
print(index, item) # Migrate to print() after 3.x+
Ответ 4
Протестировано на Python 3.12
Вот двенадцать примеров того, как вы можете получить доступ к индексам с соответствующими элементами массива, используя циклы for, циклы while и некоторые функции зацикливания. Обратите внимание, что индексы массива по умолчанию всегда начинаются с нуля (см. example 4
, как это изменить).
1. Создание элементов цикла с помощью счетчика и +=
оператора.
items = [8, 23, 45, 12, 78]
counter = 0
for value in items:
print(counter, value)
counter += 1
Result:
# 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)
Result:
# 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)
Result:
# 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)
Result:
# 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])
Result:
# ('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)
Result:
# 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
Result:
# 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)
Result:
# (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))
Result:
# [(0, 8), (1, 23), (2, 45), (3, 12), (4, 78)]
10. Выполните итерацию по двум спискам одновременно, используя функцию Python 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))
Result:
# 0: 8
# 1: 23
# 2: 45
# 3: 12
# 4: 78
11. Выполните цикл по двум спискам с помощью методов while
loop и 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
Result:
# 0 8
# 1 23
# 2 45
# 3 12
# 4 78
12. Кроме того, приятно перебирать элементы списка внутри класса' Static Method
.
items = [8, 23, 45, 12, 78]
class ElementPlus:
@staticmethod # decorator
def indexForEachOfMy(iterable):
for pair in enumerate(iterable):
print pair
ElementPlus.indexForEachOfMy(items)
Result:
# (0, 8)
# (1, 23)
# (2, 45)
# (3, 12)
# (4, 78)