Что такое списковое включение?
В самом простом виде, списковое включение – это компактный способ создания нового списка на основе уже существующего (или любого итерируемого объекта). Вместо того, чтобы использовать традиционный цикл for и добавлять элементы в список по одному, ты можешь сделать это в одну строку кода.
- Краткость: Они позволяют писать меньше кода.
- Читаемость: Когда ты привыкнешь к их синтаксису, ты будешь находить их более легкими для понимания, чем эквивалентные циклы for.
- Производительность: В некоторых случаях списковые включения могут быть быстрее, чем циклы for.
Вот базовый синтаксис спискового включения:
- expression: Выражение, которое определяет, как будет вычисляться каждый элемент нового списка. Это может быть что угодно: простое значение, математическая операция, вызов функции.
- item: Переменная, которая принимает значение каждого элемента из iterable по очереди.
- iterable: Итерируемый объект, например, список, кортеж, строка или результат работы range().
Пример:
Предположим, у тебя есть список чисел, и ты хочешь создать новый список, содержащий квадраты этих чисел.
Без спискового включения:
Со списковым включением:
Списковое включение делает код короче и понятнее!
Добавление условия
Списковые включения также позволяют тебе добавлять условия для выбора элементов, которые будут включены в новый список.
- condition: условие, которое должно выполняться для включения элемента в новый список.
Пример:
Создадим список квадратов только четных чисел из нашего исходного списка numbers.
Без спискового включения:
Со списковым включением:
Я добавил if number % 2 == 0 в списковое включение, чтобы отфильтровать только четные числа.
Многострочные списковые включения
Когда списковые включения становятся сложнее, их можно разбивать на несколько строк для лучшей читаемости.
Пример:
Это делает код более понятным, особенно когда у тебя есть длинные условия или сложные выражения.
Упражнения
Упражнение 1: Преобразование температур
У тебя есть список температур в градусах Цельсия, и тебе нужно преобразовать их в градусы Фаренгейта. Формула для преобразования: F = (C * 9/5) + 32.
Вот твой список температур в Цельсиях:
Задача:
- Используя списковое включение, создай новый список fahrenheit_temperatures, содержащий температуры из celsius_temperatures, преобразованные в градусы Фаренгейта.
- Выведи полученный список fahrenheit_temperatures на экран.
Подсказка:
- Используй формулу (celsius * 9/5) + 32 в качестве выражения в списковом включении.
- Подумай, что является iterable, а что item в данном случае.
Мое решение:
Разбор кода:
- celsius_temperatures = [0, 10, 20, 30, 40]: Это исходный список с температурами в градусах Цельсия.
- fahrenheit_temperatures = [...]: Здесь мы создаем новый список с помощью спискового включения.
- (celsius * 9/5) + 32: Это выражение, которое выполняется для каждого элемента. Оно преобразует температуру из Цельсия в Фаренгейт.
- for celsius in celsius_temperatures: Это часть спискового включения, которая перебирает каждый элемент в списке celsius_temperatures, присваивая его значение переменной celsius на каждой итерации.
- print(fahrenheit_temperatures): Выводит полученный список температур в Фаренгейтах.
Важно отметить:
- В данном случае, celsius_temperatures является iterable, а celsius — item.
- Я использую многострочное форматирование спискового включения для повышения читаемости кода.
- Внутри выражения я напрямую применяю формулу преобразования, используя текущее значение celsius.
Упражнение 2: Фильтрация и преобразование строк
У тебя есть список слов, и тебе нужно сделать следующее:
- Отфильтровать слова, которые начинаются с буквы "a" (регистр не важен).
- Преобразовать все оставшиеся слова в верхний регистр.
Вот твой список слов:
Задача:
- Используя списковое включение, создай новый список transformed_words, содержащий только те слова из списка words, которые не начинаются с буквы "a" (или "A"), и при этом преобразованные в верхний регистр.
- Выведи полученный список transformed_words на экран.
Подсказки:
- Используй метод строки startswith() для проверки, начинается ли слово с определенной буквы. Не забудь про регистр! Приведи все к нижнему регистру.
- Используй метод строки upper() для преобразования строки в верхний регистр.
- Подумай о порядке операций. Сначала фильтруем, потом преобразуем.
Мое решение:
Упражнение 3: Создание словаря из списка кортежей
У тебя есть список кортежей, где каждый кортеж содержит два элемента: имя и возраст человека.
Задача:
- Используя списковое включение, создай словарь people_dict, где ключами будут имена людей, а значениями — их возраст.
- Выведи словарь people_dict на экран.
Подсказки:
- Списковые включения создают списки, но их можно использовать для создания списков кортежей, которые затем можно передать в конструктор dict().
- Подумай, как извлечь имя и возраст из каждого кортежа.
- Помни, что словарь — это структура данных, которая хранит пары ключ-значение.
Немного объяснения:
В Python можно создать словарь из списка кортежей, где каждый кортеж состоит из двух элементов (ключ, значение). Для этого я использую конструктор dict(). Например:
Твоя задача состоит в том, чтобы с помощью спискового включения создать этот список кортежей, который потом будет использован для создания словаря.
Мое решение:
Разбор кода:
- people_data = [...]: Это исходный список кортежей, где каждый кортеж содержит имя и возраст человека.
- people_dict = dict(...): Мы используем конструктор dict(), чтобы создать словарь из списка кортежей.
- [ (name, age) for name, age in people_data ]: Это списковое включение, которое создает список кортежей.
(name, age): Это выражение создает кортеж из двух элементов: name и age.
for name, age in people_data: Это часть перебирает все кортежи из списка people_data. На каждой итерации кортеж распаковывается на две переменные: name и age. - print(people_dict): Выводит созданный словарь.
Ключевые моменты:
- Списковое включение создает список кортежей.
- Конструктор dict() преобразует список кортежей в словарь, используя первый элемент кортежа в качестве ключа, а второй - в качестве значения.
- Распаковка кортежей в цикле for name, age in people_data делает код более читабельным.
- Списковое включение в этом примере используется для подготовки данных для словаря.