Множества в Python: уникальные элементы, операции и применение
Этот урок переведён с английского оригинала.Read in EnglishLeer en españolСообщить об ошибке в переводе
Представьте, что вы учитель и отмечаете присутствующих. Ученик случайно расписался в листе посещаемости дважды. Значит ли это, что он на уроке дважды? Конечно, нет. Вам важно только, кто пришёл, а не сколько раз он написал своё имя.
Множество в Python работает так же. Это коллекция, которая автоматически удаляет дубликаты. Каждый элемент множества уникален. Порядок множествам тоже неважен: их интересует только принадлежность, то есть есть элемент в множестве или нет.
В этом уроке вы научитесь создавать множества, выполнять мощные операции вроде объединения и пересечения, изменять множества с помощью методов и узнаете, в каких задачах множества подходят лучше всего.
Как создать множество в Python
Множество создают, перечисляя элементы через запятую внутри фигурных скобок {}. Если добавить повторяющиеся значения, Python молча их проигнорирует.
{'apple', 'banana', 'cherry'}
{'red', 'green', 'blue'}Обратите внимание: порядок в выводе может отличаться от того, в котором вы записали элементы. Множество является неупорядоченной коллекцией, поэтому Python может хранить элементы внутри в любом порядке. Не рассчитывайте, что множество сохранит определённый порядок.
Множество можно создать и из списка с помощью конструктора set(). Это популярный способ удалить дубликаты из списка.
{'Bob', 'Alice', 'Charlie'}
{'o', 'l', 'e', 'h'}Операции над множествами: объединение, пересечение и разность
Настоящая сила множеств в операциях над множествами. С их помощью множества можно объединять, сравнивать и находить различия между ними. Представляйте их как диаграммы Венна (или круги Эйлера) из школьной математики.
Объединение: всё вместе
Объединение даёт все элементы обоих множеств без дубликатов. Используйте оператор | или метод .union().
{'Charlie', 'Bob', 'Alice', 'Diana'}
{'Charlie', 'Bob', 'Alice', 'Diana'}Пересечение: что общего
Пересечение даёт только те элементы, которые есть в обоих множествах. Используйте оператор & или .intersection().
{'Bob', 'Charlie'}Разность: что есть только в одном множестве
Разность даёт элементы, которые есть в первом множестве, но отсутствуют во втором. Используйте оператор - или .difference(). Здесь порядок имеет значение.
{'Alice'}
{'Diana'}Симметрическая разность: элементы только одного из множеств
Симметрическая разность даёт элементы, которые есть в одном из множеств, но не в обоих сразу. Её можно считать противоположностью пересечения. Используйте оператор ^ или .symmetric_difference().
{'Alice', 'Diana'}Как добавлять и удалять элементы множества
Множества изменяемы: после создания в них можно добавлять элементы и удалять их. Вот основные методы, которые вам понадобятся.
{'apple', 'banana', 'cherry'}
{'date', 'elderberry', 'apple', 'banana', 'cherry'}
{'date', 'elderberry', 'apple', 'cherry'}
{'date', 'elderberry', 'apple', 'cherry'}Ещё можно удалить из множества все элементы или извлечь из него произвольный элемент.
Removed: 50
Remaining: {20, 40, 10, 30}
set()Почему множества молниеносно проверяют принадлежность
Одна из главных причин использовать множество: проверка, есть ли в нём элемент. Ключевое слово in работает и со списками, и со множествами, но множества справляются с этим намного быстрее.
bob is allowed! eve is not on the list.
Что такое frozenset?
Frozenset (замороженное множество) представляет собой неизменяемую версию множества. После создания в него нельзя добавлять элементы и удалять их из него. Благодаря этому frozenset хешируемый, то есть его можно использовать как ключ словаря или хранить внутри других множеств.
frozenset({'u', 'o', 'i', 'e', 'a'})
frozenset({'u', 'o', 'i', 'f', 'g', 'd', 'e', 'b', 'c', 'a'})Когда использовать множество вместо списка?
Множества и списки решают разные задачи. Простое правило: если вам важен порядок или нужны повторы, используйте список. Если важны уникальность или быстрый поиск, используйте множество.
# Order matters
playlist = ['song1', 'song2', 'song3']
# Duplicates are meaningful
die_rolls = [3, 5, 3, 2, 5, 6]
# You need index access
first = playlist[0]# Only unique items matter
tags = {'python', 'coding', 'tutorial'}
# Fast membership checks
if 'python' in tags:
print('Found!')
# Removing duplicates
unique = set([1, 2, 2, 3, 3])Практические упражнения
У вас есть список адресов электронной почты, и некоторые из них повторяются. Создайте множество unique_emails из списка emails и выведите его, отсортировав по алфавиту с помощью sorted().
Что выведет этот код? Хорошо подумайте о том, как множества обрабатывают дубликаты и что возвращает функция len().
data = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique = set(data)
print(len(unique))Напишите инструкцию print(), которая выводит точно такой же результат.
У вас есть два множества: math и english. Найдите и выведите учеников, которые записаны на оба предмета. Выведите результат в виде отсортированного списка.
Этот код пытается создать пустое множество, добавить в него элементы и вывести результат. Но в нём ошибка: программист создал пустое множество с помощью {}. Исправьте ошибку, чтобы код работал правильно.
У вас есть множество recipe со всеми нужными ингредиентами и множество pantry с тем, что уже лежит у вас в кладовой. Найдите ингредиенты, которые ещё нужно купить, и выведите их в виде отсортированного списка.
Напишите функцию dedupe(items), которая удаляет дубликаты из списка и сохраняет исходный порядок элементов. Используйте множество, чтобы отслеживать уже встреченные элементы. Верните список без дубликатов.
Проверьте её вызовом print(dedupe([3, 1, 4, 1, 5, 9, 2, 6, 5, 3])).