Перейти к содержимому

Как пройтись по индексам в списке питон

  • автор:

Срезы — Python: Списки

Работать с одиночными элементами вы уже умеете. Настало время перейти к очень интересному инструменту, который Python предоставляет для работы с целыми подмножествами элементов списка: к так называемым срезам (slices).

Синтаксис описания срезов

Срезы встроены в язык и снабжены своим собственным синтаксисом — настолько широко они используются. Срез записывается так же, как записывается обращение к элементу списка по индексу:

some_list[START:STOP:STEP] 

Всего у среза три параметра:

  • START — индекс первого элемента в выборке
  • STOP — индекс элемента списка, перед которым срез должен закончиться. Сам элемент с индексом STOP не будет входить в выборку
  • STEP — шаг прироста выбираемых индексов

Математически говоря, во множество будут входить индексы элементов, которые будут выбраны:

Например, срез [3:20:5] означает выборку значений с индексами 3, 8, 13 и 18.

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

  • Умолчательный START означает «от начала списка»
  • Умолчательный STOP означает «до конца списка включительно»
  • Умолчательный STEP означает «брать каждый элемент»

Вот несколько примеров с разными наборами параметров:

  • [:] или [::] — весь список
  • [::2] — нечетные по порядку элементы
  • [1::2] — четные по порядку элементы
  • [::-1] — все элементы в обратном порядке
  • [5:] — все элементы, начиная с шестого
  • [:5] — все элементы, не доходя до шестого
  • [-2:1:-1] — все элементы от предпоследнего до третьего в обратном порядке. Во всех случаях выборки от большего индекса к меньшему нужно указывать шаг

Срезы могут работать в двух режимах: собственно выборка и присваивание.

Выборка элементов

Срезы-выборки работают со списками, кортежами, строками. Результатом применения выборки всегда становится новое значение соответствующего типа — список, кортеж, строка:

'hello'[2:] # 'llo' (1, "foo", True, None)[2:] # (True, None) [1, 2, 3, 4, 5][2:] # [3, 4, 5] 

Сразу сделаем несколько замечаний по использованию выборок:

  • Кортежи чаще всего содержат разнородные элементы, поэтому срезы для них менее полезны, чем распаковка и перепаковка: тяжело удерживать в голове типы элементов вместе с индексами
  • При выборке по срезу [:] создается новая копия списка, поэтому именно так обычно список и копируют
  • Срез порождает новый список или кортеж, но для каждого выбранного элемента копируется только ссылка

Присваивание срезу

В отличие от строк и кортежей списки могут изменяться по месту. Одним из вариантов модификации является присваивание срезу. Срезу с указанным шагом можно присвоить список, содержащий соответствующее количество новых элементов:

l = [1, 2, 3, 4, 5, 6] l[::2] = [0, 0, 0] print(l) # => [0, 2, 0, 4, 0, 6] 

Если вы попробуете присвоить срезу с шагом неверное количество элементов, то получите ошибку:

l = [1, 2, 3, 4] l[::2] = [5, 6, 7] # Traceback (most recent call last): # File "", line 1, in # ValueError: attempt to assign sequence of size 3 to extended slice of size 2 

Если срез непрерывный, то есть шаг не указан и индексы идут подряд, то свободы нам дается больше. Такому срезу можно присвоить как больше элементов — тогда список вырастет, так и меньше, что приведет к урезанию списка:

l = [1, 2, 3] l[2:] = [4, 5] print(l) # => [1, 2, 4, 5] l[1:-1] = [100] print(l) # => [1, 100, 5] l[:] = [] print(l) # => [] 

Сначала список растет, потом уменьшается, а под конец вообще становится пустым — и все с помощью компактного, но мощного синтаксиса срезов.

Срезы-значения

Хоть срезы и имеют специальную поддержку со стороны синтаксиса, но мы можем создавать и использовать срезы сами по себе — как обычные значения.

Значение среза можно сконструировать с помощью функции slice :

first_two = slice(2) each_odd = slice(None, None, 2) print(each_odd) # => slice(None, None, 2) l = [1, 2, 3, 4, 5] print(l[first_two]) # => [1, 2] print(l[each_odd]) # => [1, 3, 5] 

Функция slice принимает от одного до трех параметров — те самые START , STOP и STEP . При вызове функции с одним параметром, функция вызывается с параметром STOP .

Если вы хотите пропустить один из параметров, то подставьте вместо него None . Также None можно использовать и в записи срезов в квадратных скобках — там он так же будет означать пропуск значения.

На месте параметров среза могут быть любые выражения, лишь бы эти выражения вычислялись в целые числа или None .

Соотношение START и STOP

В срезе элемент с индексом STOP не попадает в выборку, в отличие от элемента с индексом START .

У такого поведения есть одна особенность. Какой бы неотрицательный индекс n мы ни выбрали, для любого списка будет соблюдаться указанное равенство:

l == l[:n] + l[n:] 

Посмотрим на такой пример:

s = 'Hello!' print(s[:2] + s[2:]) # => 'Hello!' print(s[:4] + s[4:]) # => 'Hello!' print(s[:0] + s[0:] == s) # => True print(s[:100] + s[100:] == s) # => True 

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

Обход списка с индексами в Python

В этом посте будет обсуждаться, как пройти список с индексами в Python, не изменяя исходный список.

Стандартная версия цикла for печатает только элементы списка, но не их индексы.

if __name__ == ‘__main__’ :
a = [ 1 , 2 , 3 , 4 , 5 ]
for x in a :

Если вам нужны индексы, используйте enumerate() функция для получения индекса позиции и соответствующего значения.

if __name__ == ‘__main__’ :
a = [ 1 , 2 , 3 , 4 , 5 ]
for i , v in enumerate ( a ) :
print ( i , v )

Вот еще один способ итерации с индексами:

if __name__ == ‘__main__’ :
a = [ 1 , 2 , 3 , 4 , 5 ]
for i in range ( len ( a ) ) :
print ( i , a [ i ] )

Это все, что касается обхода списка с индексами в Python.

Оценить этот пост

Средний рейтинг 5 /5. Подсчет голосов: 4

Голосов пока нет! Будьте первым, кто оценит этот пост.

Сожалеем, что этот пост не оказался для вас полезным!

Расскажите, как мы можем улучшить этот пост?

Спасибо за чтение.

Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.

Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования 🙂

Подписывайся
0 Комментарии
Встроенные отзывы
Просмотреть все комментарии
Загрузить больше комментариев
Просматривать
Подпишитесь на новые публикации

  • Все проблемы
  • Практика DSA
  • 100 самых популярных задач
  • 50 лучших классических задач
  • Лучшие алгоритмы
  • Компилятор С/С++
  • Компилятор Java
  • Компилятор Python
  • Компилятор JavaScript
  • компилятор PHP
  • Компилятор C#
  • Свяжитесь с нами
  • Политика конфиденциальности
  • условия обслуживания
  • Подпишитесь на новые публикации

Techie Delight © 2023 Все права защищены.

Этот веб-сайт использует файлы cookie. Используя этот сайт, вы соглашаетесь с использованием файлов cookie, нашей политикой, условиями авторского права и другими условиями. Читайте наши Политика конфиденциальности. Понятно

Как обратиться к индексам списка в цикле?

Не получается обратиться по индексам к отсортированному массиву
Имеется программа: using System; using System.Collections.Generic; using System.Linq; using.

Как обратиться к GroupBox в цикле ?
Здравствуйте, подскажите пожалуйста, как обратиться к группе Groupbox в цикле. Фрагмент кода.

Как обратиться к переменной в цикле?
вот код: If Drinks.n1 > i1 Then Drinks.n1 = Drinks.n1 — 3 If Drinks.n2 > i1 Then Drinks.n2 =.

Как обратиться к нескольким TextBox-ам в цикле?
Подскажите, как можно обратиться по именам к нескольким текстбоксам в цикле, если над ними нужно.

2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
Newibe,

1 2 3 4 5 6 7
>>> for i, _ in enumerate([1, 23, 54, 1]): . print(i) . 0 1 2 3

Регистрация: 02.04.2016
Сообщений: 351
alex925, спасибо. я сделал по-другому, вот так:

1 2 3 4 5 6 7 8 9 10 11
a = [int(i) for i in input ().split()] for i in range(len(a)): if i == 0: sum = a[1] + a[-1] print(sum, end=' ') elif i == -1: sum = a[0] + a[-2] print(sum, end=' ') else: sum = a[i-1] + a[i+1] print(sum, end=' ')

НО почему-то он пропускает if и elif и sum всегда считает через else. Как будто i не бывает равно 0 и -1. Вопрос — почему?

2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830

Newibe,
— первое условие выполняется как ему и положено
— elif не выполнится никогда (не может быть индекс -1)
— вообще то у тебя в коде ошибка и он свалится на последней итерации при выполнении else

4973 / 3209 / 1125
Регистрация: 21.03.2016
Сообщений: 7,939

ЦитатаСообщение от alex925 Посмотреть сообщение

elif не выполнится никогда (не может быть индекс -1)

индекс то может быть -1 но не в данном случае это точно так как range(len(a)) начинает отсчет по умолчанию с 0 если не задан начальный диапазон

1 2 3 4 5
>>> a = 'index' >>> print(a[1]) n >>> print(a[-1]) x

а свалится из за выхода за пределы индексов при

else: sum = a[i-1] + a[i+1]

когда i приймет значение максимального индекса и a[i+1] будет выход за пределы индексов списка
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830

ЦитатаСообщение от Semen-Semenich Посмотреть сообщение

индекс то может быть -1

Вообще в целом индекс может быть отрицательным, но в том цикле что рассматривается, он ни когда не будет таким.

4973 / 3209 / 1125
Регистрация: 21.03.2016
Сообщений: 7,939
то что наверно хотел автор

1 2 3 4 5 6 7 8 9 10 11
a = [int(i) for i in input ().split()] for i in range(-(len(a)-1), len(a)-1): if i == 0: sum = a[1] + a[-1] print(sum, end=' ') elif i == -1: sum = a[0] + a[-2] print(sum, end=' ') else: sum = a[i-1] + a[i+1] print(sum, end=' ')

Регистрация: 02.04.2016
Сообщений: 351

alex925, вы правы, так и есть. вот только не могу разобраться почему. не нашел другого способа обратиться к последнему элементу, кроме как по индексу -1.

2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830

Лучший ответ

Сообщение было отмечено Newibe как решение

Решение

Newibe, это ты так к последнему индексу можешь обратиться, чтобы вытащить элемент, но в цикле. Тебе нужно проверять:

if i == len(a) - 1:

Регистрация: 02.04.2016
Сообщений: 351
Semen-Semenich, почти! у вас три лишние цифры выводятся. можете объяснить строчку:

for i in range(-(len(a)-1), len(a)-1):

for i in range понятно, а дальше не могу разобраться!!

Добавлено через 1 минуту
alex295, я пробовал так, не вышло

Добавлено через 56 секунд
а с -1 ща попробую

2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
Newibe, не верю
Регистрация: 02.04.2016
Сообщений: 351
alex925,

if i == len(a) - 1:

да, с -1 получилось. спасибо

Добавлено через 42 секунды
alex925, чему не верите?
вы написали сначала так:

if i == len(a)

попробуйте сами.
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
Это оппечатка была
Регистрация: 02.04.2016
Сообщений: 351
alex925, странно, я думал len() считает элементы списка начиная с нуля
4973 / 3209 / 1125
Регистрация: 21.03.2016
Сообщений: 7,939

ЦитатаСообщение от Newibe Посмотреть сообщение

я думал len() считает элементы списка начиная с нуля

len считает длину списка то есть len(‘abcde’) равна 5 а вот индексы начинаются с нуля и индекс последнего элемента 4
а range(len(a)) по умолчанию начинается с нуля (если не задан начальный диапазон) и не захватывает верхнее значение.
поэтому range(5) выведет 0 1 2 3 4

Регистрация: 02.04.2016
Сообщений: 351
Semen-Semenich, ну да да. надеюсь теперь запомню
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Как обратиться к нескольким Label в цикле
у меня на форме есть n-ое количество лейблов. я хочу к ним всем обратится чтобы изменить свойства.

Как обратиться к другим формам в цикле
Как обратиться к элементу Label в цикле придумал, получается что-то вроде этого: .

Как мне обратиться к кнопкам в цикле?
Прошу прощения, это наверно глупый вопрос, но я даже не знаю какой запрос ввести в гугл. У меня.

Как обратиться к кнопке созданной в цикле?
Здравствуйте, пишу игру "Жизнь", клетки реализую в виде кнопок, которые создаются в цикле(их 1600).

Как обратиться к нескольким CheckBox в цикле
Вопрос в следующем: возможно ли обращаться к объекту через индексы? К примеру: У меня есть штук.

Как обратиться к нескольким CheckBox в цикле
Здравствуйте. Мне по очереди надо проверить 10 checkbox’ов. checkbox1 . checkbox10. Могу ли я.

Как в цикле обратиться к определенным полям в отчете?
К примеру, имеем отчет со 100 полями, которым присваиваем значения при открытии отчета. Как в цикле.

Как получить доступ к индексу в цикле 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 содержит эти три элемента:

  1. iterable — коллекция, элементы которой мы можем проверять по одному
  2. member — значение или объект в списке (который является повторяемым)
  3. 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))) 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *