← Назад к вопросам

Что такое Set comprehension в Python?

2.3 Middle🔥 21 комментариев
#DevOps и инфраструктура#Django

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Set Comprehension в Python

Set comprehension — это компактный и эффективный способ создания множеств (sets) в Python, используя синтаксис, похожий на list comprehension. Это встроенный в язык инструмент, который позволяет генерировать множества на основе существующих последовательностей или условий.

Синтаксис Set Comprehension

Базовая форма:

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

С условием:

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

Основные примеры

Простое преобразование списка:

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

# Преобразование в верхний регистр
words = ["apple", "banana", "apple", "cherry"]
upper_words = {word.upper() for word in words}
print(upper_words)  # {'APPLE', 'BANANA', 'CHERRY'}

С условиями:

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

# Только строки длиной больше 3
long_words = {word for word in ["a", "apple", "bat", "banana"] if len(word) > 3}
print(long_words)  # {'apple', 'banana'}

Преимущества Set Comprehension

1. Автоматическое удаление дубликатов:

numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique_squares = {n**2 for n in numbers}
print(unique_squares)  # {1, 4, 9, 16} — дубликаты удалены

# Вместо:
unique_set = set([n**2 for n in numbers])

2. Производительность — быстрее чем list + set():

import timeit

# Set comprehension
time1 = timeit.timeit('{x**2 for x in range(1000)}', number=10000)

# List comprehension + set conversion
time2 = timeit.timeit('set([x**2 for x in range(1000)])', number=10000)

print(f"Set comprehension: {time1}")
print(f"List + set: {time2}")  # Set comprehension быстрее

3. Более читаемый код:

# Плохо — три строки
result = []
for user in users:
    if user["age"] >= 18:
        result.append(user["id"])
id_set = set(result)

# Хорошо — одна строка
id_set = {user["id"] for user in users if user["age"] >= 18}

Практические примеры

Получение уникальных элементов с трансформацией:

# Email адреса в нижнем регистре
emails = ["Alice@Example.com", "bob@EXAMPLE.COM", "alice@example.com"]
unique_emails = {email.lower() for email in emails}
print(unique_emails)  # {'alice@example.com', 'bob@example.com'}

# Только доменные имена
domains = {email.split("@")[1] for email in emails}
print(domains)  # {'example.com'}

Работа с вложенными структурами:

# Все ID из списка словарей
users = [
    {"id": 1, "name": "Alice"},
    {"id": 2, "name": "Bob"},
    {"id": 1, "name": "Charlie"}  # Дубликат ID
]

user_ids = {user["id"] for user in users}
print(user_ids)  # {1, 2}

Вычисление пересечения и различий:

list1 = [1, 2, 3, 4, 5]
list2 = [4, 5, 6, 7, 8]

# Элементы только из первого списка
only_in_first = {x for x in list1 if x not in list2}
print(only_in_first)  # {1, 2, 3}

# Элементы в обоих
both = {x for x in list1 if x in list2}
print(both)  # {4, 5}

Set Comprehension vs List/Dict Comprehension

# List comprehension — сохраняет порядок и дубликаты
list_comp = [x for x in [1, 2, 2, 3]]
print(list_comp)  # [1, 2, 2, 3]

# Set comprehension — удаляет дубликаты, неупорядочен
set_comp = {x for x in [1, 2, 2, 3]}
print(set_comp)  # {1, 2, 3}

# Dict comprehension — создаёт словарь
dict_comp = {x: x**2 for x in range(1, 4)}
print(dict_comp)  # {1: 1, 2: 4, 3: 9}

Вложенные Set Comprehensions

# Декартово произведение с условием
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# Все нечётные элементы
odd_elements = {num for row in matrix for num in row if num % 2 != 0}
print(odd_elements)  # {1, 3, 5, 7, 9}

Когда использовать Set Comprehension

  • Нужны только уникальные элементы
  • Требуется быстрая проверка принадлежности (O(1) вместо O(n))
  • Нужны операции над множествами (объединение, пересечение)
  • Важна читаемость кода

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