В прошлый раз мы разобрали, что такое списки и как с ними работать: создавать, добавлять элементы, удалять и перебирать. Теперь пойдём дальше. Вы узнаете три приёма, которые позволяют получать из имеющихся списков новые списки — изменённые, уменьшенные или отфильтрованные.
Представьте, что у вас есть коробка с разными фруктами. Вы хотите:
- Преобразовать каждый фрукт — например, наклеить на каждый ценник. Это сопоставление (в программировании его ещё иногда называют «отображение» или «проецирование», а также «мэппинг» — map).
- Оставить только нужные фрукты — например, зелёные яблоки, а красные убрать. Это отбор (фильтрация — filter).
- Собрать один общий результат из всего списка — например, общий вес всех фруктов. Это сокращение (свёртка, агрегация — reduce).
Рассмотрим каждый приём на примерах кода, понятных новичку.
Сопоставление (преобразование каждого элемента)
Что это такое
Сопоставление — это когда мы берём каждый элемент исходного списка, делаем с ним одно и то же действие, и кладём результат в новый список. Количество элементов не меняется — меняется их «содержимое».
Простой способ – цикл
Допустим, у нас есть список температур в градусах Цельсия, а нам нужно получить такой же список в градусах Фаренгейта.
Более краткий способ – генератор списка
В Python есть удобная сокращённая запись, которая делает то же самое за одну строку.
celsius = [0, 10, 20, 30]
farengeit = [t * 9/5 + 32 for t in celsius]
print(farengeit) # [32.0, 50.0, 68.0, 86.0]
Читается это так: «взять каждый элемент t из списка celsius, вычислить выражение и собрать результаты в новый список».
Другие примеры сопоставления:
- Перевести имена в верхний регистр: [имя.upper() for имя in ["анна", "борис"]]
- Вычислить квадраты чисел: [x**2 for x in [1, 2, 3]]
- Перевести рубли в доллары: [round(рубль / 90, 2) for рубль in [100, 500, 1000]]
Главное правило сопоставления: на входе 5 элементов — на выходе тоже 5 элементов, но каждый изменён по заданному правилу.
Отбор (фильтрация)
Что это такое
Отбор — это когда мы выбираем из списка только те элементы, которые подходят под условие. Количество элементов в новом списке может быть меньше, чем в исходном, а может и совпадать (если подошли все).
Способ с циклом
Оставим из списка чисел только чётные.
Краткая запись (тоже генератор списка, но с условием)
Условие дописывается в конец.
числа = [1, 2, 3, 4, 5, 6]
чётные = [число for число in числа if число % 2 == 0]
print(чётные) # [2, 4, 6]
Читается: «взять каждое число из списка числа, но только если оно чётное, и собрать в новый список».
Другие примеры отбора:
- Оставить строки длиннее 3 символов: [слово for слово in ["кот", "собака", "дом"] if len(слово) > 3]
- Оставить оценки выше тройки: [оценка for оценка in [2, 4, 5, 3, 2] if оценка > 3]
- Оставить положительные числа: [x for x in [-5, 0, 3, -1, 8] if x > 0]
Отбор можно совмещать с сопоставлением в одном генераторе. Например, взять числа, оставить только положительные и сразу перевести их в строки:
исходные = [10, -3, 25, -7, 4]
результат = [str(число) for число in исходные if число > 0]
print(результат) # ['10', '25', '4']
Здесь сначала срабатывает отбор (if число > 0), затем сопоставление (str(число)).
Сокращение (получение одного значения из всего списка)
Что это такое
Сокращение — это когда из всего списка мы получаем один итоговый результат. Например, сумму всех чисел, самое большое слово, общую стоимость товаров.
Здесь уже не обойтись без цикла — краткой записи «в одну клетку» для любых сокращений нет, но для самых частых случаев в Python есть встроенные помощники.
Встроенные сокращатели
Для самых простых задач язык уже даёт готовые функции:
числа = [5, 12, 3, 8]
сумма = sum(числа) # 28
максимум = max(числа) # 12
минимум = min(числа) # 3
количество = len(числа) # 4
Ручное сокращение через цикл
Если нужно что-то нестандартное, пишем цикл. Например, соединим все строки списка в одну длинную строку:
Другой пример — произведение всех чисел (для этого нет встроенной функции, но легко сделать самому):
Ещё пример — найдём самое длинное слово:
Какой приём когда использовать
- Сопоставление — нужно изменить каждый элемент по одному правилу. (Исходный список остаётся неизменным, создаётся новый).
- Отбор — нужно оставить только элементы, отвечающие условию.
- Сокращение — нужно получить один итог: сумму, максимум, предложение из слов и так далее.
Важное замечание
Все эти приёмы не изменяют исходный список, а создают новый (или одно значение). Это безопасно — вы не испортите исходные данные. Если же вы хотите изменить сам исходный список, то лучше работать напрямую по индексам, как мы рассматривали в прошлой статье (через присваивание список[индекс] = новое_значение).
Заключение
Мы рассмотрели три ключевых действия над списками:
- Сопоставление — превращаем каждый элемент по формуле.
- Отбор — оставляем только подходящие.
- Сокращение — сворачиваем весь список в одно значение.
Теперь вы можете обрабатывать данные в Python гораздо гибче: чистить списки от мусора, преобразовывать форматы, подсчитывать итоги. Пробуйте писать небольшие примеры сами — это лучший способ закрепить навык.
Подписывайтесь на канал, чтобы не пропустить новые уроки по Python.