Генераторы множеств (set comprehensions)

Генераторы множеств (set comprehensions) Генераторы списков и словарей

Привет! Мы уже изучили генераторы списков и словарей. Теперь остался ещё один тип — генераторы множеств. Они используются для создания множеств в одну строку и особенно полезны, когда нужно удалить дубликаты.

В этой статье мы разберём:

  • Что такое генератор множества
  • Синтаксис и базовые примеры
  • Условия в генераторах множеств
  • Отличия от других генераторов

Что нужно знать перед началом

Для этого урока тебе понадобится:

  • Установленный Python
  • Базовое понимание множеств и генераторов списков

Совет: Генератор множества — это способ создания множеств в одну строку. Он особенно полезен для удаления дубликатов.

Основная часть

Что такое генератор множества

Генератор множества — это способ создания множеств в одну строку с использованием выражения и цикла for.

Синтаксис:

{выражение for переменная in итерируемый_объект}

Пример:

# Создаём множество квадратов чисел от 0 до 4
squares = {x ** 2 for x in range(5)}
print(squares)   # {0, 1, 4, 9, 16}

Совет: Это эквивалентно следующему коду, но короче:

squares = set()
for x in range(5):
    squares.add(x ** 2)
print(squares)   # {0, 1, 4, 9, 16}

Отличия от генераторов списков и словарей

ГенераторСинтаксисВозвращает
Списка[expr for x in iterable]Список
Словаря{key: value for x in iterable}Словарь
Множества{expr for x in iterable}Множество

Важно: Генератор множества использует фигурные скобки {}, но без ключей. Если внутри есть двоеточие :, это генератор словаря.

Базовые примеры

Удаление дубликатов из списка:

# Список с дубликатами
numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique = {x for x in numbers}
print(unique)   # {1, 2, 3, 4}

Квадраты чисел от 0 до 9:

squares = {x ** 2 for x in range(10)}
print(squares)   # {0, 1, 4, 9, 16, 25, 36, 49, 64, 81}

Строки в верхнем регистре:

words = ["apple", "banana", "cherry", "apple"]
unique_upper = {word.upper() for word in words}
print(unique_upper)   # {'APPLE', 'BANANA', 'CHERRY'}

Генераторы с условиями

if в конце — фильтрация:

# Только чётные числа
evens = {x for x in range(10) if x % 2 == 0}
print(evens)   # {0, 2, 4, 6, 8}

if в выражении — преобразование:

# Чётные → квадрат, нечётные → 0
result = {x ** 2 if x % 2 == 0 else 0 for x in range(10)}
print(result)   # {0, 4, 16, 36, 64}

Совет: В множестве не может быть дубликатов. Если два элемента равны, они схлопнутся в один.

Вложенные генераторы множеств

# Все комбинации цветов и размеров (без дубликатов)
colors = ["red", "green", "blue"]
sizes = ["S", "M", "L"]
combinations = {(color, size) for color in colors for size in sizes}
print(combinations)
# {('red', 'S'), ('red', 'M'), ('red', 'L'), ...}

Примеры из реальной жизни

Пример 1. Уникальные символы в строке:

text = "hello world"
unique_chars = {char for char in text if char != " "}
print(unique_chars)   # {'h', 'e', 'l', 'o', 'w', 'r', 'd'}

Пример 2. Уникальные длины слов:

words = ["cat", "python", "dog", "elephant", "cat"]
unique_lengths = {len(word) for word in words}
print(unique_lengths)   # {3, 5, 6, 8}

Пример 3. Фильтрация и преобразование:

# Уникальные квадраты чётных чисел от 0 до 10
even_squares = {x ** 2 for x in range(11) if x % 2 == 0}
print(even_squares)   # {0, 4, 16, 36, 64, 100}

Генератор множества vs set()

# Через генератор
numbers = [1, 2, 2, 3, 4, 4]
unique = {x for x in numbers}
print(unique)   # {1, 2, 3, 4}

# Через set()
numbers = [1, 2, 2, 3, 4, 4]
unique = set(numbers)
print(unique)   # {1, 2, 3, 4}

Совет: Используй set() для простого удаления дубликатов, и генератор, если нужно преобразовать элементы.

Задачи для закрепления

Задача 1. Создай множество квадратов чисел от 0 до 6.

Задача 2. Создай множество уникальных букв из строки «abracadabra».

Задача 3. Создай множество чётных чисел от 0 до 20.

Задача 4. Создай множество уникальных длин слов из списка ["cat", "python", "dog", "elephant"].

Задача 5. Создай множество кубов чисел от 0 до 10, исключая числа, которые не делятся на 3.

Ответы:

Задача 1.

squares = {x ** 2 for x in range(7)}
print(squares)   # {0, 1, 4, 9, 16, 25, 36}

Задача 2.

text = "abracadabra"
unique = {char for char in text}
print(unique)   # {'a', 'b', 'r', 'c', 'd'}

Задача 3.

evens = {x for x in range(21) if x % 2 == 0}
print(evens)   # {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20}

Задача 4.

words = ["cat", "python", "dog", "elephant"]
lengths = {len(word) for word in words}
print(lengths)   # {3, 6, 8}

Задача 5.

cubes = {x ** 3 for x in range(11) if x % 3 == 0}
print(cubes)   # {0, 27, 216, 729, 1000}

Нюансы и подводные камни

Множества неупорядочены

Порядок элементов в множестве не гарантируется.

print({x for x in range(5)})   # {0, 1, 2, 3, 4}
# Может вывести {0, 1, 2, 3, 4} в любом порядке

Уникальность элементов

Множества автоматически удаляют дубликаты.

duplicates = [1, 1, 2, 2, 3, 3]
unique = {x for x in duplicates}
print(unique)   # {1, 2, 3}

Изменяемость элементов

Множества могут содержать только неизменяемые элементы (числа, строки, кортежи). Списки и словари нельзя добавлять в множество.

# Ошибка! Список нельзя добавить в множество
# {[1, 2] for i in range(3)}

# Кортеж можно
{(i, i+1) for i in range(3)}

Частые ошибки и как их избежать

Ошибка 1: Путаница между множеством и словарём

# Словарь (есть ключи и значения)
{x: x ** 2 for x in range(5)}   # {0: 0, 1: 1, 2: 4, ...}

# Множество (только значения)
{x ** 2 for x in range(5)}   # {0, 1, 4, 9, 16}

Ошибка 2: Попытка добавить изменяемый элемент

Используй кортежи вместо списков для множеств.

Ошибка 3: Неправильный синтаксис

Всегда используй {} для множества и :} для словаря.

Шпаргалка

Что нужноКак пишется
Базовый генератор{expr for x in iterable}
С условием (фильтрация){expr for x in iterable if cond}
С условием (преобразование){expr1 if cond else expr2 for x in iterable}
Вложенный генератор{(a, b) for a in iter1 for b in iter2}
Удаление дубликатов{x for x in list_with_duplicates}

Заключение / Выводы

Сегодня мы:

  • Узнали, что такое генераторы множеств
  • Изучили синтаксис и базовые примеры
  • Разобрали условия в генераторах
  • Познакомились с вложенными генераторами

КВИЗ

Что дальше?

Оцените статью
IMI-DS - PYTHON LERNEN
Содержание
Оглавление ×