Как получить доступ к индексу в цикле Python
Python - это язык программирования очень высокого уровня, и он имеет тенденцию отклоняться от всего, отдаленно напоминающего внутреннюю структуру данных. Из-за этого нам обычно не нужны индексы списка для доступа к его элементам, однако иногда они нам очень нужны.
В этой статье мы рассмотрим различные подходы к тому, как получить доступ к индексу в цикле for Python.
Как получить индекс?
Самый простой и самый популярный метод доступа к индексу элементов в цикле for - это просмотреть длину списка, увеличивая index
. При каждом увеличении мы получаем доступ к списку index
:
my_list = [3, 5, 4, 2, 2, 5, 5]
print("Indices and values in my_list:")
for index in range(len(my_list)):
print(index, my_list[index], end = "\n")
Здесь мы не перебираем список, как обычно. Мы выполняем итерацию 0..len(my_list)
с помощью index
. Затем мы используем эту переменную index
для доступа к элементам списка в порядке 0..n
, где n
- конец списка.
Этот код выдаст результат:
Indices and values in my_list:
0 3
1 5
2 4
3 2
4 2
5 5
6 5
Использование enumerate()
enumerate()
- это встроенная функция Python, которая очень полезна, когда мы хотим получить доступ как к значениям, так и к индексам списка. Стоит отметить, что это самый быстрый и эффективный метод получения индекса в цикле for.
Этот метод добавляет счетчик к итерируемому объекту и возвращает их вместе как перечислимый объект. Этот объект перечисления можно легко преобразовать в список с помощью конструктора list()
. Это наиболее распространенный способ одновременного доступа к обоим элементам и их индексам.
Теперь давайте посмотрим на код, который иллюстрирует использование этого метода:
my_list = [3, 5, 4, 2, 2, 5, 5]
print("Indices and values in my_list:")
for index, value in enumerate(my_list):
print(list((index, value)))
Этот код выдаст результат:
Indices and values in my_list:
[0, 3]
[1, 5]
[2, 4]
[3, 2]
[4, 2]
[5, 5]
[6, 5]
В этом примере мы перечислили каждое значение в списке с его соответствующим индексом, создав объект enumerate. Затем мы преобразовали этот объект перечисления в список с помощью конструктора list()
и распечатали каждый список в стандартный вывод.
Кроме того, вы можете установить аргумент start
для изменения индексации. В настоящее время он имеет значение 0. Давайте вместо этого изменим его, чтобы начать с 1
:
my_list = [3, 5, 4, 2, 2, 5, 5]
print("Indices and values in my_list:")
for index, value in enumerate(my_list, start=1):
print(list((index, value)))
Теперь это дает:
Indices and values in my_list:
[1, 3]
[2, 5]
[3, 4]
[4, 2]
[5, 2]
[6, 5]
[7, 5]
Использование списков
Понимание списков - это способ определения и создания списков на основе уже существующих списков. Обычно это более быстрый, элегантный и компактный способ управления списками по сравнению с функциями и циклами for
.
Каждое представление списка в Python содержит эти три элемента:
- iterable - коллекция, элементы которой мы можем проверять по одному
- member - значение или объект в списке (который является повторяемым)
- expression - может быть любым допустимым выражением, возвращающим значение (член, итерация, вызов функции ...)
Давайте посмотрим на следующий пример:
my_list = [1, 2, 3, 4, 5]
my_list_squared = [m*m for m in my_list]
print(my_list_squared)
Этот код выдаст результат:
[1, 4, 9, 16, 25]
В этом понимании список my_list
представляет итерируемый объект, m
представляет член и m*m
представляет выражение.
Теперь, когда мы рассмотрели, что такое понимание списка, мы можем использовать его для перебора списка и доступа к его индексам и соответствующим значениям. Давайте посмотрим на этот пример:
my_list = [3, 5, 4, 2, 2, 5, 5]
print("Indices and values in my_list:")
print([list((i, my_list[i])) for i in range(len(my_list))])
Этот код выдаст результат:
Indices and values in my_list:
[[0, 3], [1, 5], [2, 4], [3, 2], [4, 2], [5, 5], [6, 5]]
В этом примере мы использовали конструктор list()
. Этот конструктор не принимает аргументов или имеет один аргумент - итерацию. Сюда входит любой объект, который может быть последовательностью (строка, кортежи) или коллекцией (набор, словарь).
Если параметры не переданы, он возвращает пустой список, а если итерируемый объект передается в качестве параметра, он создает список, состоящий из его элементов.
Мы построили список из двух элементов, которые имеют формат [elementIndex, elementValue]
. Эти двухэлементные списки были созданы путем передачи пар конструктора list()
, который затем выдал эквивалентный список.
Это создаст 7 отдельных списков, содержащих индекс и соответствующее ему значение, которые будут напечатаны.
Использование zip()
Функция zip()
принимает два или более параметров, которые все должны быть итерируемые.
Он возвращает zip-объект - итератор кортежей, в котором первый элемент в каждом переданном итераторе объединяется в пары, второй элемент в каждом переданном итераторе объединяется в пары, и аналогично для остальных из них:
list_a = [1, 2, 3]
list_b = ['A', 'B', 'C']
# Zip will make touples from elements with the same
# index (position in the list). Meaning that 1 from the
# first list will be paired with 'A', 2 will be paired
# with 'B' and so on...
for elem1,elem2 in zip(list_a,list_b):
print((elem1,elem2))
Запустив приведенный выше фрагмент кода, мы получим:
(1, 'A')
(2, 'B')
(3, 'C')
Длина итератора, возвращаемого этой функцией, равна длине наименьшего из ее параметров.
Теперь, когда мы объяснили, как работает эта функция, давайте воспользуемся ею для решения нашей задачи:
my_list = [3, 5, 4, 2, 2, 5, 5]
print ("Indices and values in my_list:")
for index, value in zip(range(len(my_list)), my_list):
print((index, value))
Этот код выдаст результат:
Indices and values in my_list:
(0, 3)
(1, 5)
(2, 4)
(3, 2)
(4, 2)
(5, 5)
(6, 5)
В этом примере мы передали последовательность чисел в диапазоне от 0
до len(my_list)
в качестве первого параметра функции zip()
и my_list
ее второго параметра. Функция объединила каждый индекс с соответствующим значением, и мы распечатали их как кортежи с помощью цикла for
.
Если бы мы хотели преобразовать эти кортежи в список, мы бы использовали конструктор list()
, и наша функция print
выглядела бы так:
print(list((index, value)))