Appearance
Collection Comprehensions — Коллекции включений
Коллекции включений (Collection comprehensions) — это мощный и удобный инструмент Python, который позволяет создавать новые коллекции, такие как списки, кортежи, множества и словари, на основе существующих коллекций и итераторов.
1. List Comprehensions — Списки Включений
Списки включений — предоставляют компактный способ создания списков, с применением выражения к каждому элементу в последовательности, и возможностью фильтрации.
В этом примере создается список, который содержит квадрат числа, если оно четное, и само число, если нечетное. В список попадают только те числа, которые больше 5.
python
# Пример с итератором:
numbers = range(10)
result = list(x**2 if x % 2 == 0 else x for x in numbers if x > 5)
print(result) # Вывод: [36, 49, 64, 81]
# Краткий синтаксис:
result = [x**2 if x % 2 == 0 else x for x in numbers if x > 5]
print(result) # Вывод: [36, 49, 64, 81]
Упражнения:
- Создайте список, содержащий куб числа, если оно нечетное, и квадрат — если оно четное, для чисел от 0 до 20, но в список должны попадать только числа больше 10.
- Напишите список включений, который из строки создаст список символов, если они являются буквами.
2. Tuple Comprehensions — Кортежи Включений
Хотя Python напрямую не поддерживает кортежи включений, можно использовать генераторы для создания кортежа через функцию tuple()
. Включения для кортежей работают так же, как и для списков, но результатом является неизменяемая структура данных.
В этом примере создается кортеж, где нечетные числа умножаются на 3, а четные остаются без изменений. В кортеж попадают только числа меньше 7.
python
# Пример с итератором:
numbers = range(10)
result = tuple(x*3 if x % 2 != 0 else x for x in numbers if x < 7)
print(result) # Вывод: (0, 3, 6, 9, 12, 15)
# Краткий синтаксис:
result = tuple(x*3 if x % 2 != 0 else x for x in numbers if x < 7)
print(result) # Вывод: (0, 3, 6, 9, 12, 15)
Упражнения:
- Создайте кортеж, состоящий из квадратов чисел от 1 до 15, исключив при этом числа, кратные 5.
- Напишите кортеж включений, который из списка чисел создаст кортеж, содержащий только четные числа, умноженные на 2.
3. Set Comprehensions — Множества Включений
Множества включений работают аналогично спискам, но результатом является множество, где каждый элемент уникален.
В этом примере создается множество, в котором четные числа возводятся в квадрат, а нечетные остаются без изменений. Множество автоматически удаляет дубликаты.
python
# Пример с итератором:
numbers = [1, 2, 2, 3, 4, 5, 5, 6]
result = set(x**2 if x % 2 == 0 else x for x in numbers)
print(result) # Вывод: {1, 3, 4, 9, 16, 25, 36}
# Краткий синтаксис:
result = {x**2 if x % 2 == 0 else x for x in numbers}
print(result) # Вывод: {1, 3, 4, 9, 16, 25, 36}
Упражнения:
- Напишите множество включений, которое из строки создаст множество уникальных символов, если они являются заглавными буквами.
- Создайте множество включений, которое содержит числа от 1 до 20, возведенные в квадрат, но только если число нечетное.
4. Dictionary Comprehensions — Словари Включений
Словари включений позволяют создавать новые словари на основе итераторов, используя пары ключ-значение. Это особенно полезно для преобразования данных и фильтрации.
В этом примере создается словарь, где ключ — это число, а значение — его квадрат, если число четное, и само число, если оно нечетное.
python
# Пример с итератором:
numbers = range(5)
result = dict((x, x**2 if x % 2 == 0 else x) for x in numbers)
print(result) # Вывод: {0: 0, 1: 1, 2: 4, 3: 3, 4: 16}
# Краткий синтаксис:
result = {x: x**2 if x % 2 == 0 else x for x in numbers}
print(result) # Вывод: {0: 0, 1: 1, 2: 4, 3: 3, 4: 16}
Упражнения:
- Напишите словарь включений, который создает словарь из строки, где ключ — это символ, а значение — его код ASCII, но только для букв.
- Создайте словарь включений, который сопоставляет числа от 1 до 10 с их кубами, если число кратно 3, и с их квадратами — если число кратно 2.
5. Смешанные коллекции включений
В Python можно комбинировать разные типы коллекций включений, создавая более сложные структуры данных. Рассмотрим пример, где список включений генерирует словари, а эти словари затем собираются в список.
В этом примере создается список словарей, где каждому студенту соответствует его оценка. Если оценка ниже 80, ей присваивается значение 'needs improvement'
.
python
# Генерация списка словарей
students = ['Alice', 'Bob', 'Charlie']
grades = [85, 92, 78]
result = [{'name': name, 'grade': grade if grade >= 80 else 'needs improvement'} for name, grade in zip(students, grades)]
print(result)
# Вывод: [{'name': 'Alice', 'grade': 85}, {'name': 'Bob', 'grade': 92}, {'name': 'Charlie', 'grade': 'needs improvement'}]
В этом примере создается словарь, где ключ — это четное число, а значение — это список всех чисел от 0 до этого числа.
python
# Генерация словаря списков
numbers = range(10)
result = {x: [y for y in range(x)] for x in numbers if x % 2 == 0}
print(result)
# Вывод: {0: [], 2: [0, 1], 4: [0, 1, 2, 3], 6: [0, 1, 2, 3, 4, 5], 8: [0, 1, 2, 3, 4, 5, 6, 7]}
Упражнения:
- Создайте список множества включений, где каждое множество содержит уникальные символы из строк в заданном списке строк.
- Напишите словарь включений, который создает словарь из списка чисел, где ключ — это число, а значение — это кортеж, содержащий квадрат и куб числа.
- Сгенерируйте список словарей, где каждому числу от 1 до 5 соответствует словарь с двумя полями: квадрат и факториал числа.
Советы по использованию comprehensions:
- Читаемость кода: Хотя включения значительно сокращают код, убедитесь, что он остаётся читаемым. Если выражение становится слишком сложным, лучше использовать обычные циклы
for
. - Использование условий: Условия внутри включений помогают гибко фильтровать данные или изменять их в зависимости от условий.
- Не забывайте про производительность: Включения могут быть быстрее, чем стандартные циклы, но для очень больших коллекций или сложных вычислений они могут стать менее эффективными. В таких случаях стоит рассмотреть использование генераторов, которые не хранят данные в памяти.
- Вложенные структуры: Включения можно вкладывать друг в друга, что позволяет создавать многомерные структуры (например, списки списков). Однако не злоупотребляйте вложениями, так как это может снизить читаемость кода.
Итог
Коллекции включений — это один из ключевых инструментов Python, который облегчает работу с данными. Они позволяют быстро и легко генерировать новые коллекции на основе уже существующих и предоставляют гибкие возможности для фильтрации и трансформации данных. Важно помнить, что comprehensions должны использоваться для упрощения кода, а не для создания чересчур сложных и запутанных конструкций.
Дополнительные упражнения:
- Напишите программу, которая на основе списка строк создаёт словарь, где ключ — это строка, а значение — это её длина, но только для строк, длина которых больше 3 символов.
- Создайте множество включений, которое содержит все уникальные символы из списка слов, но только если слово начинается с гласной буквы.
- Используя смешанные включения, создайте список словарей, где каждый словарь содержит информацию о числе и его факториале для чисел от 1 до 7, но добавляйте только те числа, которые делятся на 2 или 3.