Изучение множеств в Python: создание, свойства и использование для работы с уникальными элементами и выполнением операций над ними.

онлайн тренажер по питону
Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Самоучитель Python 3, собранный из материалов данного сайта.Предназначен в основном для тех, кто хочет изучить язык программирования Python с нуля.

Что такое множества в Python

Множества в Python представляют собой неупорядоченные коллекции уникальных (неповторяющихся) элементов. Они являются одним из основных типов данных в Python и предоставляют эффективные способы работы с уникальными значениями. Множества особенно полезны для выполнения математических операций: объединение, пересечение, разность и симметричная разность.

Создание множеств в Python

Пустое множество

Для создания пустого множества используйте функцию set(). Важно помнить, что {} создает пустой словарь, а не множество.

empty_set = set()
print(type(empty_set))  # <class 'set'>

Множество с элементами

fruits = {"apple", "banana", "cherry"}
print(fruits)  # {'apple', 'banana', 'cherry'}

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

Один из наиболее распространенных способов создания множества - преобразование списка. Это автоматически удаляет все дубликаты.

numbers = [1, 2, 2, 3, 4, 4, 5]
unique_numbers = set(numbers)
print(unique_numbers)  # {1, 2, 3, 4, 5}

Создание множества из строки

text = "hello"
char_set = set(text)
print(char_set)  # {'h', 'e', 'l', 'o'}

Основные операции с множествами

Добавление элементов

Метод add()

Добавляет один элемент в множество. Если элемент уже существует, множество не изменяется.

fruits = {"apple", "banana"}
fruits.add("cherry")
print(fruits)  # {"apple", "banana", "cherry"}

# Попытка добавить существующий элемент
fruits.add("apple")
print(fruits)  # {"apple", "banana", "cherry"} - без изменений

Метод update()

Добавляет несколько элементов в множество. Принимает итерируемые объекты.

fruits = {"apple", "banana"}
fruits.update(["cherry", "date"])
print(fruits)  # {"apple", "banana", "cherry", "date"}

# Можно добавить элементы из другого множества
fruits.update({"grape", "orange"})
print(fruits)  # {"apple", "banana", "cherry", "date", "grape", "orange"}

Удаление элементов

Метод remove()

Удаляет элемент из множества. Если элемент не найден, вызывает KeyError.

fruits = {"apple", "banana", "cherry"}
fruits.remove("banana")
print(fruits)  # {"apple", "cherry"}

# fruits.remove("grape")  # Вызовет KeyError

Метод discard()

Удаляет элемент из множества, если он существует. Если элемент не найден, не вызывает ошибок.

fruits = {"apple", "banana", "cherry"}
fruits.discard("banana")
print(fruits)  # {"apple", "cherry"}

fruits.discard("grape")  # Не вызовет ошибку
print(fruits)  # {"apple", "cherry"}

Метод pop()

Удаляет и возвращает случайный элемент из множества. Если множество пусто, вызывает KeyError.

fruits = {"apple", "banana", "cherry"}
removed_fruit = fruits.pop()
print(f"Удален: {removed_fruit}")
print(fruits)

Метод clear()

Удаляет все элементы из множества.

fruits = {"apple", "banana", "cherry"}
fruits.clear()
print(fruits)  # set()

Математические операции с множествами

Объединение множеств (Union)

Объединение создает новое множество, содержащее все элементы из обоих множеств.

a = {1, 2, 3}
b = {3, 4, 5}

# Используя оператор |
union_set = a | b
print(union_set)  # {1, 2, 3, 4, 5}

# Используя метод union()
union_set = a.union(b)
print(union_set)  # {1, 2, 3, 4, 5}

# Объединение нескольких множеств
c = {6, 7}
union_multiple = a.union(b, c)
print(union_multiple)  # {1, 2, 3, 4, 5, 6, 7}

Пересечение множеств (Intersection)

Пересечение возвращает элементы, которые присутствуют в обоих множествах.

a = {1, 2, 3}
b = {3, 4, 5}

# Используя оператор &
intersection_set = a & b
print(intersection_set)  # {3}

# Используя метод intersection()
intersection_set = a.intersection(b)
print(intersection_set)  # {3}

Разность множеств (Difference)

Разность возвращает элементы, которые есть в первом множестве, но нет во втором.

a = {1, 2, 3}
b = {3, 4, 5}

# Используя оператор -
difference_set = a - b
print(difference_set)  # {1, 2}

# Используя метод difference()
difference_set = a.difference(b)
print(difference_set)  # {1, 2}

Симметричная разность (Symmetric Difference)

Симметричная разность возвращает элементы, которые есть в одном из множеств, но не в обоих.

a = {1, 2, 3}
b = {3, 4, 5}

# Используя оператор ^
symmetric_difference_set = a ^ b
print(symmetric_difference_set)  # {1, 2, 4, 5}

# Используя метод symmetric_difference()
symmetric_difference_set = a.symmetric_difference(b)
print(symmetric_difference_set)  # {1, 2, 4, 5}

Проверка отношений между множествами

Метод issubset()

Проверяет, является ли одно множество подмножеством другого.

a = {1, 2, 3}
b = {1, 2, 3, 4, 5}
is_subset = a.issubset(b)
print(is_subset)  # True

# Альтернативный способ
is_subset = a <= b
print(is_subset)  # True

Метод issuperset()

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

a = {1, 2, 3, 4, 5}
b = {1, 2, 3}
is_superset = a.issuperset(b)
print(is_superset)  # True

# Альтернативный способ
is_superset = a >= b
print(is_superset)  # True

Метод isdisjoint()

Проверяет, не имеют ли множества общих элементов.

a = {1, 2, 3}
b = {4, 5, 6}
is_disjoint = a.isdisjoint(b)
print(is_disjoint)  # True

c = {3, 4, 5}
is_disjoint = a.isdisjoint(c)
print(is_disjoint)  # False

Итерация по множествам

Множества поддерживают итерацию, но порядок элементов не гарантируется.

fruits = {"apple", "banana", "cherry"}
for fruit in fruits:
    print(fruit)

# Проверка принадлежности элемента
if "apple" in fruits:
    print("Apple найдено в множестве")

Генераторы множеств (Set Comprehensions)

Генераторы множеств позволяют создавать множества с помощью краткой записи.

# Множество квадратов чисел
squares = {x ** 2 for x in range(10)}
print(squares)  # {0, 1, 4, 9, 16, 25, 36, 49, 64, 81}

# Множество четных чисел
even_numbers = {x for x in range(20) if x % 2 == 0}
print(even_numbers)  # {0, 2, 4, 6, 8, 10, 12, 14, 16, 18}

# Множество длин слов
words = ["hello", "world", "python", "set"]
word_lengths = {len(word) for word in words}
print(word_lengths)  # {3, 5, 6}

Работа множеств с другими типами данных

Множества и списки

# Удаление дубликатов из списка
numbers = [1, 2, 2, 3, 4, 4, 5]
unique_numbers = list(set(numbers))
print(unique_numbers)  # [1, 2, 3, 4, 5]

# Сохранение порядка при удалении дубликатов
def remove_duplicates_preserve_order(lst):
    seen = set()
    result = []
    for item in lst:
        if item not in seen:
            seen.add(item)
            result.append(item)
    return result

numbers = [1, 2, 2, 3, 4, 4, 5]
unique_ordered = remove_duplicates_preserve_order(numbers)
print(unique_ordered)  # [1, 2, 3, 4, 5]

Множества и строки

# Создание множества уникальных символов строки
string = "hello world"
unique_chars = set(string)
print(unique_chars)  # {'d', 'e', 'h', 'l', 'o', 'r', 'w', ' '}

# Удаление пробелов
unique_chars_no_space = set(string.replace(" ", ""))
print(unique_chars_no_space)  # {'d', 'e', 'h', 'l', 'o', 'r', 'w'}

Множества и кортежи

Множества могут содержать кортежи, так как они неизменяемы и хэшируемы.

coordinates = {(1, 2), (3, 4), (5, 6)}
print(coordinates)

# Добавление новых координат
coordinates.add((7, 8))
print(coordinates)  # {(1, 2), (3, 4), (5, 6), (7, 8)}

Множества и словари

# Ключи словаря как множество
my_dict = {"a": 1, "b": 2, "c": 3}
keys_set = set(my_dict.keys())
print(keys_set)  # {'a', 'b', 'c'}

# Значения словаря как множество
values_set = set(my_dict.values())
print(values_set)  # {1, 2, 3}

Практические примеры и полезные приемы

Нахождение дубликатов в списке

def find_duplicates(lst):
    seen = set()
    duplicates = set()
    for item in lst:
        if item in seen:
            duplicates.add(item)
        else:
            seen.add(item)
    return duplicates

numbers = [1, 2, 2, 3, 4, 4, 5]
duplicates = find_duplicates(numbers)
print(duplicates)  # {2, 4}

Удаление элементов, присутствующих в другом списке

list1 = [1, 2, 3, 4, 5]
list2 = [2, 4, 6]
result = list(set(list1) - set(list2))
print(result)  # [1, 3, 5]

Поиск общих элементов в нескольких списках

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

common_elements = set(list1) & set(list2) & set(list3)
print(common_elements)  # {4, 5}

Проверка на наличие общих элементов

def have_common_elements(list1, list2):
    return not set(list1).isdisjoint(set(list2))

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

print(have_common_elements(list1, list2))  # False
print(have_common_elements(list1, list3))  # True

Замороженные множества (Frozenset)

Frozenset - это неизменяемая версия множества, которую можно использовать как ключ словаря или элемент другого множества.

# Создание замороженного множества
frozen_set = frozenset([1, 2, 3, 4])
print(frozen_set)  # frozenset({1, 2, 3, 4})

# Использование как ключ словаря
my_dict = {frozen_set: "значение"}
print(my_dict)  # {frozenset({1, 2, 3, 4}): 'значение'}

# Множество из замороженных множеств
set_of_frozensets = {frozenset([1, 2]), frozenset([3, 4])}
print(set_of_frozensets)  # {frozenset({1, 2}), frozenset({3, 4})}

Производительность и оптимизация

Множества обеспечивают O(1) время поиска элементов, что делает их эффективными для:

  • Проверки принадлежности элемента
  • Удаления дубликатов
  • Математических операций над коллекциями
import time

# Сравнение производительности поиска в списке и множестве
large_list = list(range(100000))
large_set = set(large_list)

# Поиск в списке
start = time.time()
99999 in large_list
list_time = time.time() - start

# Поиск в множестве
start = time.time()
99999 in large_set
set_time = time.time() - start

print(f"Время поиска в списке: {list_time:.6f} секунд")
print(f"Время поиска в множестве: {set_time:.6f} секунд")

 

Множества в Python - это мощный инструмент для работы с уникальными данными и выполнения математических операций над коллекциями. Они обеспечивают высокую производительность и читаемость кода при решении задач, связанных с обработкой уникальных элементов и множественными операциями.

таблица методов множеств в Python:

Метод Описание Пример Результат
add(elem) Добавляет элемент в множество s = {1, 2}; s.add(3) {1, 2, 3}
remove(elem) Удаляет элемент (ошибка если нет) s = {1, 2, 3}; s.remove(2) {1, 3}
discard(elem) Удаляет элемент (без ошибки если нет) s = {1, 2}; s.discard(3) {1, 2}
pop() Удаляет и возвращает случайный элемент s = {1, 2, 3}; x = s.pop() x = 1 (например)
clear() Очищает множество s = {1, 2, 3}; s.clear() set()
copy() Создает копию множества s1 = {1, 2}; s2 = s1.copy() s2 = {1, 2}
update(other) Добавляет элементы из другого множества s = {1, 2}; s.update({3, 4}) {1, 2, 3, 4}
union(other) Возвращает объединение множеств {1, 2}.union({3, 4}) {1, 2, 3, 4}
intersection(other) Возвращает пересечение множеств {1, 2, 3}.intersection({2, 3, 4}) {2, 3}
difference(other) Возвращает разность множеств {1, 2, 3}.difference({2, 3, 4}) {1}
symmetric_difference(other) Возвращает симметричную разность {1, 2, 3}.symmetric_difference({2, 3, 4}) {1, 4}
intersection_update(other) Обновляет множество пересечением s = {1, 2, 3}; s.intersection_update({2, 3, 4}) {2, 3}
difference_update(other) Обновляет множество разностью s = {1, 2, 3}; s.difference_update({2, 3, 4}) {1}
symmetric_difference_update(other) Обновляет множество симметричной разностью s = {1, 2, 3}; s.symmetric_difference_update({2, 3, 4}) {1, 4}
issubset(other) Проверяет, является ли подмножеством {1, 2}.issubset({1, 2, 3}) True
issuperset(other) Проверяет, является ли надмножеством {1, 2, 3}.issuperset({1, 2}) True
isdisjoint(other) Проверяет, нет ли общих элементов {1, 2}.isdisjoint({3, 4}) True

Операторы для множеств:

Оператор Метод Описание
` ` union()
& intersection() Пересечение
- difference() Разность
^ symmetric_difference() Симметричная разность
` =` update()
&= intersection_update() Обновление пересечением
-= difference_update() Обновление разностью
^= symmetric_difference_update() Обновление симметричной разностью
 

категории

  • Введение в Python
  • Основы программирования на Python
  • Управляющие конструкции
  • Структуры данных
  • Функции и модули
  • Обработка исключений
  • Работа с файлами и потоками
  • файловая система
  • Объектно-ориентированное программирование (ООП)
  • Регулярные выражения
  • Дополнительные темы
  • Общая база питона