Как вытащить элемент из списка python
Перейти к содержимому

Как вытащить элемент из списка python

  • автор:

Как вытащить элемент из списка python

Скачай курс
в приложении

Перейти в приложение
Открыть мобильную версию сайта

© 2013 — 2023. Stepik

Наши условия использования и конфиденциальности

Get it on Google Play

Public user contributions licensed under cc-wiki license with attribution required

Цикл for — Python: Списки

Ранее мы рассматривали цикл while . Эта конструкция предназначена для повторения некоего набора действий — все, что выходит за рамки повторения, требует дополнительных средств для хранения состояния.

Возьмем для примера счетчик, который мы изменяем в цикле. При работе с коллекциями нам нужно как-то выбирать, с каким элементом мы работаем в текущей итерации. Так что же, использовать переменную-счетчик каждый раз?

Любой программист всегда стремится автоматизировать рутинную работу, и авторы языков — не исключение. Поэтому в Python для работы с коллекциями существует другой вид цикла — цикл for .

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

Python пошел дальше, поэтому в этом языке цикл for сразу перебирает элементы входной коллекции, и думать об индексе чаще всего вообще не нужно.

Синтаксис

Цикл for устроен очень просто:

for element in collection: print(element) # this is body of cycle 

Заметьте, в простейшем случае у цикла даже нет явного условия завершения. Цикл просто останавливается, когда в коллекции заканчиваются элементы.

Пример выше сработает для кортежей и списков — в этом случае будут выведены все элементы. А еще коллекции можно проитерировать — так называют обход коллекции. В таком случае переменная цикла ( element ) будет поочередно содержать все символы строки:

for c in 'Hello!': print(c) # => H # => e # => l # => l # => o # => ! 

Но что же делать, если нам нужно не просто получить элементы списка один за другим, но и изменить эти элементы? Ведь для этого нам понадобится индекс каждого элемента.

На этот случай в Python есть удобная функция «пронумеровать» — enumerate . Эта функция снабжает каждый элемент индексом, складывая каждый индекс вместе с элементом в кортеж. Кортежи эти, как правило, прямо в первой строке цикла и распаковывают:

items = ['foo', 'bar', 'baz'] for (index, elem) in enumerate(items): print(f'index> elem>') # => 0 foo # => 1 bar # => 2 baz 

В этом цикле мы вывели каждый элемент рядом с его индексом.

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

items = ['foo', 'bar', 'baz'] for (index, _) in enumerate(items): items[index] += '!' print(items) # => ['foo!', 'bar!', 'baz!'] 

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

Это не какая-то особая переменная, а всего лишь соглашение: в Python часто незначимые в этом контексте вещи записывают в переменную _ .

Заметьте: в последнем примере речь и шла об индексах, но мы все равно не использовали длину коллекции. Функция enumerate тоже знает, где остановиться — в конце исходной коллекции.

Управление циклом с помощью break и continue

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

Такой ранний выход из цикла делается с помощью команды break . Вот цикл поиска первого положительного числа:

items = [-2, 0, -10, 3, 5, -1] for item in items: if item > 0: break print(item) # => 3 

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

Этот код, кажется, работает как надо. Однако если в списке не встретится ни одного положительного числа, то в переменной item окажется просто последний элемент списка.

Как же понять, что мы ничего не нашли? На помощь приходит else . В цикле else выполняется, если цикл так и не прервался с помощью break . Для алгоритмов поиска — это идеальный вариант. Перепишем наш пример с применением else :

items = [-2, 0, -10, -1] for item in items: if item > 0: break else: item = None print(item) # => None 

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

Для перехода к следующей итерации предназначена команда continue . Ее использование продемонстрирует следующий пример: мы читаем строки, содержащие строчки кода, но нам не нужно обрабатывать код тех строчек, которые начинаются с символа # . Вот так будет выглядеть код:

lines_of_code = [ '# begin of example', 'echo 123', 'cd foo', '# end'] for line in lines_of_code: if line[:1] == '#': continue # Здесь происходит обработка кода print(line) # => echo 123 # => cd foo 

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

break , continue , else и цикл while

Ветка else и команды break и continue доступны и для цикла while . Вот комплексный пример, демонстрирующий все эти возможности:

tries_count = 3 while tries_count: print('>>> ', end='') command = input() if not command: continue if command in ('echo', 'cd', 'help'): break print('Unknown command!') tries_count -= 1 else: print('Too many bad tries!') command = None 

Этот код просит пользователя ввести одну из команд, игнорирует пустой ввод, ограничивает количество попыток ввода. Подумайте, какая часть тела цикла за что отвечает.

Цикл for и изменяемые коллекции

Хотим предостеречь от изменения состава списка во время обхода его же в цикле for . Программа может завершиться с ошибкой, если вы будете менять список, по которому проходитесь — например, удалять или добавлять новые элементы. Лучше наполнять новый список в процессе обхода старого.

Если вы хотите обязательно изменить состав исходного списка, то обходите в цикле его копию:

for x in original_list[:]: original_list.pop(0) 

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

new_list = [] for x in original_list: . original_list[:] = [] # удаляем старое содержимое original_list.extend(new_list) 

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

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

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

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

Удаление элемента из списка по индексу в Python

Часто встречается задача, когда нужно удалить элемент из списка по его индексу. Например, есть список чисел:

numbers = [10, 20, 30, 40, 50]

И нужно удалить элемент под индексом 2 (число 30).

Функция list.remove() в данном случае не подойдет, так как она удаляет элементы по значению, а не по индексу. Поиск элемента по значению может занять довольно много времени, особенно если список большой.

В Python для этой задачи предусмотрен встроенный метод list.pop() . Этот метод удаляет элемент по указанному индексу и возвращает его значение. Если индекс не указан, то удаляет последний элемент.

Вот как можно использовать этот метод:

numbers = [10, 20, 30, 40, 50] deleted_element = numbers.pop(2) print(numbers) # Вывод: [10, 20, 40, 50] print(deleted_element) # Вывод: 30

В данном примере метод pop() удаляет элемент под индексом 2 из списка numbers и возвращает его значение, которое сохраняется в переменной deleted_element .

Если попытаться удалить элемент по несуществующему индексу, то Python выдаст ошибку IndexError .

numbers = [10, 20, 30, 40, 50] deleted_element = numbers.pop(10) # Выдаст ошибку IndexError

Поэтому перед использованием метода pop() рекомендуется проверять, существует ли указанный индекс в списке, чтобы избежать ошибок.

Поиск элемента в списке Python

Поиск элемента в списке Python

Сегодня я расскажу, как проверить, содержит ли список элемент с помощью разных операторов в Python.

Используя цикл for

В качестве примера, я буду использовать список строк, содержащих несколько животных:

animals = ['Dog', 'Cat', 'Bird', 'Fish']

Простой и рудиментарный метод проверки, содержит ли список элемент: наш метод проходит через элемент и проверяет, соответствует ли элемент, на котором мы находимся, тому, который мы ищем. Давайте для этого воспользуемся циклом for:

for animal in animals: if animal == 'Bird': print('Chirp!')
Chirp!

Используя оператор in

Теперь более лаконичным подходом было бы использование встроенного оператора in, но с оператором if вместо оператора for. В паре с if он возвращает True, если элемент существует в последовательности или нет. Синтаксис оператора in выглядит следующим образом:

element in list

Используя этот оператор, мы можем сократить наш предыдущий код в один оператор:

if 'Bird' in animals: print('Chirp')
Chirp

Этот подход имеет ту же эффективность, что и цикл for, поскольку оператор in, используемый таким образом, вызывает функцию list.__contains__, которая по своей сути циклически проходит через список — хотя это гораздо читабельнее.

Используя оператор not in

Вы можете использовать оператор not in, который является логической противоположностью оператору in. Он возвращает True, если элемент не присутствует в последовательности.

Давайте перепишем предыдущий пример кода, чтобы использовать оператор not in:

if 'Bird' not in animals: print('Chirp')

Запуск этого кода ничего не даст, так как Bird присутствует в нашем списке.

Но если мы попробуем это с Wolf:

if 'Wolf' not in animals: print('Howl')
Howl

С помощью лямбда функции

Еще один способ проверить, присутствует ли элемент — отфильтровать все, кроме этого элемента, точно так же, как просеять песок и проверить, остались ли в конце какие-нибудь раковины. Встроенный метод filter() принимает в качестве аргументов лямбда-функцию и список. Здесь мы можем использовать лямбда-функцию для проверки нашей строки «Bird» в списке animals.

Затем мы оборачиваем результаты в list(), так как метод filter() возвращает объект filter, а не результаты. Если мы упакуем объект filter в список, он будет содержать элементы, оставшиеся после фильтрации:

retrieved_elements = list(filter(lambda x: 'Bird' in x, animals)) print(retrieved_elements)
['Bird']

Сейчас этот подход не самый эффективный. Это довольно медленнее, чем предыдущие три подхода, которые мы использовали. Сам метод filter() эквивалентен функции генератора:

(item for item in iterable if function(item))

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

Используя функцию any

Еще один отличный встроенный подход заключается в использовании функции any, которая является просто вспомогательной функцией, которая проверяет, есть ли какие-либо (по крайней мере 1) экземпляры элемента в списке. Он возвращает True или False в зависимости от наличия или отсутствия элемента:

if any(element in 'Bird' for element in animals): print('Chirp')

Поскольку это приводит к True, наш оператор print сработает:

Chirp

Этот подход также является эффективным способом проверки наличия элемента. Он ничем не уступает первым трём проверкам!

Используя метод count

Наконец, мы можем использовать функцию count, чтобы проверить, присутствует ли элемент или нет:

list.count(element)

Эта функция возвращает вхождение данного элемента в последовательность. Если он больше 0, мы можем быть уверены, что данный элемент находится в списке.

Давайте проверим результаты функции count:

if animals.count('Bird') > 0: print("Chirp")

Функция count по своей сути зацикливает список, чтобы проверить количество вхождений, и этот код приводит к запуску print:

Chirp

Заключение

В этой статье я рассмотрел несколько способов, как проверить, присутствует ли элемент в списке или нет. Я использовал цикл for, операторы in и not in, а также методы filter, any и count.

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

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