Привет! Мы уже изучили генераторы списков и словарей. Теперь остался ещё один тип — генераторы множеств. Они используются для создания множеств в одну строку и особенно полезны, когда нужно удалить дубликаты.
В этой статье мы разберём:
- Что такое генератор множества
- Синтаксис и базовые примеры
- Условия в генераторах множеств
- Отличия от других генераторов
- Что нужно знать перед началом
- Основная часть
- Что такое генератор множества
- Отличия от генераторов списков и словарей
- Базовые примеры
- Генераторы с условиями
- Вложенные генераторы множеств
- Примеры из реальной жизни
- Генератор множества vs set()
- Задачи для закрепления
- Нюансы и подводные камни
- Множества неупорядочены
- Уникальность элементов
- Изменяемость элементов
- Частые ошибки и как их избежать
- Ошибка 1: Путаница между множеством и словарём
- Ошибка 2: Попытка добавить изменяемый элемент
- Ошибка 3: Неправильный синтаксис
- Шпаргалка
- Заключение / Выводы
- КВИЗ
- Что дальше?
Что нужно знать перед началом
Для этого урока тебе понадобится:
- Установленный 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} |
Заключение / Выводы
Сегодня мы:
- Узнали, что такое генераторы множеств
- Изучили синтаксис и базовые примеры
- Разобрали условия в генераторах
- Познакомились с вложенными генераторами








