6 практических следствий теории множеств в Python

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-е издание.


Также опубликовано здесь


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE