6 практических следствий теории множеств в Python
25 апреля 2023 г.Краткое руководство по эффективному внедрению и использованию наборов
УPython уже есть наборы, но они используются не так часто, как списки. Тем не менее, в некоторых случаях они могут быть очень полезными.
Что такое наборы?
Набор – это набор уникальных объектов.
Основной вариант использования — удаление дубликатов.
test_set = ['spam', 'spam', 'eggs', 'spam', 'bacon', 'eggs']
print(set(test_set))
# {'eggs', 'spam', 'bacon'}
print(list(set(l)))
#['eggs', 'spam', 'bacon']
В Python есть два типа наборов:
* Изменяемый тип set. * Неизменяемый родственный тип frozenset.
Тип набора сам по себе не хешируется, однако элементы набора должны быть хешируемыми, чтобы обеспечить уникальность. Тип замороженного набора можно хэшировать, поскольку он неизменяем по умолчанию.
В дополнение к этому, Set Type реализует многие операции как инфиксные операторы, например, для двух наборов a и b:
* а | b возвращает их союз. * &ампер; b вычисляет пересечение. * а - б разница. * a ^ b симметричная разность.
# Defining the two sets
first_set = {1, 5, 7, 4, 5}
second_set = {4, 5, 6, 7, 8}
# Creating the intersection of the two sets
intersect_set = first_set & second_set
print(intersect_set) # Output: {4, 5}
# Creating the union of the two sets
union_set = first_set | second_set
print(union_set) # Output: {1, 2, 3, 4, 5, 6, 7, 8}
# Creating the difference of the two sets
diff_set = first_set - second_set
print(diff_set) # Output: {1, 2, 3}
Как создать набор?
Python предоставляет различные способы создания или инстанцирования объектов-наборов, первый — с помощью буквального синтаксиса, а второй — с помощью понимания множества, и это неудивительно, поскольку набор — это последовательность Python.
Установить литералы
Стандартное строковое представление наборов всегда использует нотацию {…}.
Синтаксис довольно прост с одной оговоркой: нельзя создать пустой набор, поэтому мы должны вызывать конструктор напрямую.
not_an_empty_set = {1, 5, 7, 4, 5} # Set Literal
empty_sest = set() # Empty Set
Синтаксис {1, 2, 3} быстрее и легче читается, чем набор ([1, 2, 3]). Последняя форма вычисляется медленнее, поскольку Python должен проверить имя набора, создать список и затем передать его конструктору.
Установить понимание
SetComp похож на listComp и dictComp, это создание набора на основе существующих итераций.
new_set = {s for s in [1, 2, 1, 0]}
print(new_set)
# set([0, 1, 2])
Практические последствия использования наборов
Тип набора и тип замороженного набора реализованы с помощью хэш-таблицы, и это может иметь определенные последствия:
* Элементы набора должны быть хешируемыми объектами. Они должны реализовать правильные методы "hash" и "eq".
* Тестирование членства очень эффективно. Набор может состоять из миллионов элементов, но элемент можно найти напрямую, вычислив его хэш-код и получив смещение индекса.
* Наборы имеют значительные накладные расходы памяти, иногда низкоуровневый массив был бы более компактным и эффективным.
* Если два элемента разные, но имеют одинаковый хеш-код, их положение зависит от того, какой элемент добавляется первым, поэтому порядок элементов зависит от порядка вставки.
* Добавление элементов в набор может изменить порядок существующих элементов. Это связано с тем, что алгоритм становится менее эффективным, если хеш-таблица заполнена более чем на две трети.
* Представления Dict реализуют операции, аналогичные операциям над наборами, использование операторов set с представлениями сэкономит много циклов и операторов if при проверке содержимого словарей в вашем коде.
Дополнительная литература
- Документация стандартной библиотеки Python, «коллекции — типы данных-контейнеры» , включает примеры и практические рецепты с несколькими типами сопоставления.
- Третья глава книги, Fluent Python
- Первая глава книги, Python Cookbook, 3-е издание.
Также опубликовано здесь
Оригинал