Skip to content

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]

Упражнения:

  1. Создайте список, содержащий куб числа, если оно нечетное, и квадрат — если оно четное, для чисел от 0 до 20, но в список должны попадать только числа больше 10.
  2. Напишите список включений, который из строки создаст список символов, если они являются буквами.

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. Создайте кортеж, состоящий из квадратов чисел от 1 до 15, исключив при этом числа, кратные 5.
  2. Напишите кортеж включений, который из списка чисел создаст кортеж, содержащий только четные числа, умноженные на 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. Напишите множество включений, которое из строки создаст множество уникальных символов, если они являются заглавными буквами.
  2. Создайте множество включений, которое содержит числа от 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}

Упражнения:

  1. Напишите словарь включений, который создает словарь из строки, где ключ — это символ, а значение — его код ASCII, но только для букв.
  2. Создайте словарь включений, который сопоставляет числа от 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. Создайте список множества включений, где каждое множество содержит уникальные символы из строк в заданном списке строк.
  2. Напишите словарь включений, который создает словарь из списка чисел, где ключ — это число, а значение — это кортеж, содержащий квадрат и куб числа.
  3. Сгенерируйте список словарей, где каждому числу от 1 до 5 соответствует словарь с двумя полями: квадрат и факториал числа.

Советы по использованию comprehensions:

  1. Читаемость кода: Хотя включения значительно сокращают код, убедитесь, что он остаётся читаемым. Если выражение становится слишком сложным, лучше использовать обычные циклы for.
  2. Использование условий: Условия внутри включений помогают гибко фильтровать данные или изменять их в зависимости от условий.
  3. Не забывайте про производительность: Включения могут быть быстрее, чем стандартные циклы, но для очень больших коллекций или сложных вычислений они могут стать менее эффективными. В таких случаях стоит рассмотреть использование генераторов, которые не хранят данные в памяти.
  4. Вложенные структуры: Включения можно вкладывать друг в друга, что позволяет создавать многомерные структуры (например, списки списков). Однако не злоупотребляйте вложениями, так как это может снизить читаемость кода.

Итог

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

Дополнительные упражнения:

  1. Напишите программу, которая на основе списка строк создаёт словарь, где ключ — это строка, а значение — это её длина, но только для строк, длина которых больше 3 символов.
  2. Создайте множество включений, которое содержит все уникальные символы из списка слов, но только если слово начинается с гласной буквы.
  3. Используя смешанные включения, создайте список словарей, где каждый словарь содержит информацию о числе и его факториале для чисел от 1 до 7, но добавляйте только те числа, которые делятся на 2 или 3.

Contacts: teffal@mail.ru