Подтвердить что ты не робот

Разница между кортежами и фризонсетцами в Python

Я изучаю Python 3, используя книгу Quick Python, в которой автор говорит о фризонсеттах, заявляя, что, поскольку наборы являются изменяемыми и, следовательно, нераспространяющимися, тем самым становятся непригодными для словарных ключей, их замороженные копии были введены. Помимо очевидного различия в том, что кортеж представляет собой упорядоченную структуру данных, в то время как frozenset, или, в более общем случае, набор, неупорядочен, существуют ли какие-либо другие различия между кортежем и фризонсетом?

4b9b3361

Ответ 1

tuples являются неизменяемыми lists, frozensets являются неизменяемыми sets.

tuples - это действительно упорядоченный набор объектов, но они могут содержать дубликаты и не подлежащие удалению объекты и иметь функцию среза

frozensets не индексируются, но у вас есть функциональные возможности поиска sets - O (1), а также такие функции, как объединения и пересечения. Они также не могут содержать дубликаты, например, их изменяемые копии.

Ответ 2

Несколько противник интуитивно понятен - как насчет этого bon mot:

sss = frozenset('abc')
sss |= set('efg')

Уступит:

frozenset(['a', 'c', 'b', 'e', 'g', 'f'])

Конечно, это эквивалентно x = x | y, поэтому не изменяя первоначальный фризонсет, но он не издает насмешки над термином "неизменяемый" для рецензента кода!

Ответ 3

Одна разница, которая приходит на ум, - это проблема дубликатов. Кортеж (1, 1, 1, 1, 2, 2, 2) будет именно тем, что вы ожидаете, но frozenset удалит все эти дубликаты, оставив вас с frozenset([1, 2]).

Ответ 4

Волатильность упоминает, что фризонсет не индексируется. Я смотрел на другие функции, поэтому не сразу понял, что стандартная нарезка python невозможна.

a = frozenset((1, 1, 1, 1, 2, 2, 2))  # results in frozenset([1, 2])
print a[0] 

выдаст ошибку:

TypeError: 'frozenset' object does not support indexing

Очевидно, из-за того, что он не индексируется, но хотя здесь явно стоит добавить