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

Получение отдельных элементов

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

В Python есть None — специальное значение, которое означает «нет значения». Если поиск может закончиться неудачей, функция Python может вернуть элемент или None, а вызывающий код проверяет результат с помощью is not None.

Чтение несуществующей позиции, например words[5] в списке из 5 элементов, останавливает программу с ошибкой IndexError (ошибка во время выполнения). Поэтому мы либо сначала проверяем len(), либо используем вспомогательную функцию, которая делает это за нас.

В других языках для этого есть много готовых функций. В Python обходятся несколькими инструментами: квадратными скобками, встроенной функцией next() со значением по умолчанию и небольшой вспомогательной функцией, которую вы пишете один раз.


Получение по позиции

У каждого элемента списка есть позиция, которая называется индексом. Первый индекс равен 0, поэтому последний — len(words)-1.

Чтобы прочитать элемент по позиции, укажите индекс в квадратных скобках: words[3]. Python умеет считать и с конца: отрицательный индекс, например words[-1], читает последний элемент без всяких вычислений с длиной.

В Python нет element_at_or_none() или element_at_or_else(). Небольшая вспомогательная функция сравнивает индекс с len() и возвращает либо элемент, либо None, либо результат резервной функции. Так индекс вне диапазона не может вызвать IndexError.

Элемент на заданной позиции

words[3] читает элемент с индексом 3. Поскольку счёт начинается с 0, это четвёртое слово.

Prompt
Создайте список со словами one, two, three, four, five. Выведите элемент с индексом 3 с помощью квадратных скобок.
Вывод: полная программа на Python
Element at a position

Первый и последний элемент

Первый элемент — words[0]. Последний — words[-1]: отрицательный индекс отсчитывается с конца, поэтому -1 — это последний элемент, а -2 — предпоследний.

Prompt
Создайте список со словами one, two, three, four, five. Выведите первый элемент по индексу 0, а затем последний элемент по индексу -1.
Вывод: полная программа на Python
First and last element

Элемент на позиции или None

element_at сравнивает индекс с len(). Индекс 1 входит в диапазон, поэтому функция возвращает слово two. Индекс 5 выходит за пределы диапазона, поэтому функция возвращает None вместо того, чтобы вызвать IndexError.

Prompt
Напишите вспомогательную функцию element_at, которая возвращает элемент по индексу или None, если индекс выходит за пределы списка. Вызовите её для слов one, two, three, four, five с индексом 1 и с индексом 5 и выведите оба результата.
Вывод: полная программа на Python
Element at a position, or None

Элемент на позиции или резервное значение

element_at_or_else принимает резервную функцию. Эта функция получает индекс, поэтому может составить сообщение вроде «Значение для индекса 5 не определено».

Prompt
Напишите вспомогательную функцию element_at_or_else, которая возвращает элемент по индексу или результат резервной функции, получающей этот индекс. Вызовите её для слов one, two, three, four, five с индексом 5 и резервной функцией, которая составляет текст «Значение для индекса 5 не определено». Выведите результат.
Вывод: полная программа на Python
Element at a position, or a fallback

Получение по условию

Часто позиция неизвестна. Зато известно условие: первое слово длиннее 3 букв, последнее слово, которое начинается с "f". Условие записывается в генераторном выражении, например w for w in words if len(w) > 3, которое выдаёт только подходящие слова.

Чтобы получить первое совпадение, передайте генератор встроенной функции next(). Она берёт первое значение, которое выдаёт генератор, и на остальные не смотрит. Если ничего не подошло, next() вызывает ошибку StopIteration — если только вы не передали ей второй аргумент, значение по умолчанию, которое тогда и возвращается.

Функции для последнего совпадения нет. reversed() проходит список с конца, поэтому next() над генератором по перевёрнутому списку находит последнее совпадение: первое попадание при движении с конца — это последнее совпадение в списке.

Если значение по умолчанию — None, то «ничего не подошло» — это просто результат, для которого is None.

Первое совпадение

next() берёт первое слово, которое генератор выдаёт с условием len(w) > 3. Это слово three.

Prompt
Создайте список со словами one, two, three, four, five. С помощью next() и генераторного выражения найдите первое слово длиннее 3 букв и выведите его.
Вывод: полная программа на Python
First match

Последнее совпадение

Генератор проходит reversed(words), то есть начинает с конца. Первое встреченное слово, которое начинается с "f", — это five, поэтому next() возвращает его, а остальные слова не проверяются.

Prompt
Создайте список со словами one, two, three, four, five. С помощью next() поверх reversed() найдите последнее слово, которое начинается с "f", и выведите его.
Вывод: полная программа на Python
Last match

Первое совпадение или None

Ни одно слово не длиннее 6 букв, поэтому next() возвращает значение по умолчанию None, и программа выводит «не найдено». В списке чисел первое чётное число — 2.

Prompt
Используйте next() со значением по умолчанию None. В словах one, two, three, four, five найдите слово длиннее 6 букв и выведите «не найдено», если результат равен None. Затем найдите в числах 1, 2, 3, 4 первое чётное число и выведите его.
Вывод: полная программа на Python
First match, or None

Последнее совпадение или None

reversed(numbers) проходит числа с конца. Последнее чётное число — 4, и оно находится сразу.

Prompt
Используйте next() поверх reversed() со значением по умолчанию None для чисел 1, 2, 3, 4, чтобы найти последнее чётное число, и выведите его, если результат не равен None.
Вывод: полная программа на Python
Last match, or None

Получение с помощью селектора

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

Функция-селектор выполняет изменение и возвращает None для неподходящих результатов. map() применяет селектор к каждому элементу, а next() с проверкой is not None берёт первый подходящий результат. Здесь список одновременно содержит число, строку и логическое значение (bool) — список Python может смешивать типы. str() превращает любое значение в текст.

Первое преобразованное значение, которое подходит

Каждое значение превращается в текст с помощью str(). 0 становится "0", а это слишком коротко, поэтому селектор возвращает None. В "true" 4 символа, поэтому это первый результат, не равный None, и программа выводит true.

Prompt
Создайте список, содержащий 0, строку "true" и False. Напишите функцию-селектор, которая превращает значение в текст с помощью str() и возвращает None, если в тексте меньше 4 символов. Выведите первый результат селектора, не равный None.
Вывод: полная программа на Python
First converted value that fits

Случайный элемент

Чтобы выбрать случайный элемент, выберите случайный индекс. Модуль random выдаёт случайные числа; rng.randrange(n) возвращает число от 0 до n-1, а это как раз диапазон допустимых индексов.

В Python также есть rng.choice(), который выбирает элемент напрямую. В этом примере сначала выбирается индекс, чтобы его было видно; choice() делает то же самое одним вызовом.

Генератор, созданный с помощью random.Random(42), начинает с фиксированного начального значения (seed). С тем же начальным значением программа каждый раз выбирает один и тот же элемент, поэтому вывод предсказуем — именно поэтому пример задаёт начальное значение своему генератору. Используйте random.Random() без начального значения, если хотите получать разный результат при каждом запуске.

Выбор случайного элемента

С начальным значением 42 генератор выбирает индекс 0, поэтому программа выводит 1. Измените начальное значение — и может получиться другое число.

Prompt
Создайте список с числами 1, 2, 3, 4. Создайте генератор случайных чисел с начальным значением (seed) 42 с помощью random.Random, выберите случайный индекс с помощью randrange и выведите элемент по этому индексу.
Вывод: полная программа на Python
Pick a random element

Проверка наличия элемента

Чтобы проверить, есть ли значение в списке, используйте оператор in. Он возвращает True или False.

В Python нет contains_all(). Встроенная функция all() делает это в одну строку: all(v in items for v in wanted) равно True, только если найдено каждое нужное значение. Она останавливается, как только одного значения не хватает.

В Python также нет is_empty(). Сравните длину: len(s) == 0 означает «пусто», len(s) > 0 — «не пусто». В стиле Python это ещё короче: пустой список в условии считается False, поэтому в большинстве программ на Python пишут if not words: для «пусто» и if words: для «не пусто». На этой странице выводятся проверки длины, потому что они точно показывают, что именно измеряется.

Содержит одно значение

"four" есть в списке, поэтому первая проверка даёт True. "zero" в списке нет, поэтому вторая проверка даёт False.

Prompt
Создайте список со словами one, two, three, four, five. С помощью оператора in проверьте, есть ли в списке "four" и есть ли в списке "zero". Выведите оба ответа.
Вывод: полная программа на Python
Contains one value

Содержит все значения

И "four", и "one" есть в списке, поэтому contains_all возвращает True. "zero" отсутствует, поэтому второй вызов возвращает False.

Prompt
Напишите вспомогательную функцию contains_all, которая возвращает True, только если каждое значение второго списка найдено в первом списке. Используйте all() и оператор in. Проверьте в словах one, two, three, four, five наличие four и one, а затем one и zero. Выведите оба ответа.
Вывод: полная программа на Python
Contains all values

Пустой или не пустой

У empty длина 0, поэтому len(empty) == 0 равно True. В words 5 элементов, поэтому len(words) > 0 тоже равно True.

Prompt
Создайте список со словами one, two, three, four, five и пустой список. Выведите, равна ли 0 длина пустого списка, а затем — больше ли 0 длина списка слов.
Вывод: полная программа на Python
Empty or not empty