web-dev-qa-db-fra.com

Différence entre tuples et frozensets dans Python

J'apprends Python 3 en utilisant The Quick Python Book, où l'auteur parle de frozensets, déclarant que puisque les ensembles sont mutables et donc inchangeables, devenant ainsi impropres à la vie) pour être des clés de dictionnaire, leurs homologues figés ont été introduits. À part la différence évidente qu'un tuple est une structure de données ordonnée alors que frozenset, ou plus généralement un ensemble, n'est pas ordonné, existe-t-il d'autres différences entre un tuple et un frozenset?

45
legends2k

tuples sont immuables lists, frozensets sont immuables sets.

tuples sont en effet une collection ordonnée d'objets, mais ils peuvent contenir des doublons et des objets non partageables, et ont une fonctionnalité de tranche

frozensets ne sont pas indexés, mais vous avez la fonctionnalité de sets - O(1) recherche d'élément, et des fonctionnalités telles que les unions et les intersections. Ils ont également ne peut pas contenir de doublons, comme leurs homologues mutables.

71
Volatility

Un peu contre-intuitif - qu'en est-il de ce bon mot:

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

Donnera:

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

Bien sûr, cela équivaut à x = x | y, donc ne changez pas le frozenset d'origine, mais cela ne fait pas à moitié ridicule du terme "immuable" pour le réviseur de code!

11
F1Rumors

Une différence qui me vient à l'esprit est la question des doublons. Un tuple de (1, 1, 1, 1, 2, 2, 2) Serait exactement ce à quoi vous vous attendez, mais un ensemble de frozens supprimerait tous ces doublons, vous laissant avec frozenset([1, 2]).

6
Makoto

La volatilité mentionne que les frozensets ne sont pas indexés. Je regardais les autres fonctionnalités, donc je n'ai pas immédiatement réalisé que le découpage standard python n'est pas possible.

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

donnera une erreur:

TypeError: 'frozenset' object does not support indexing

Évident du fait qu'il n'est pas indexé, mais bien qu'il valait la peine d'ajouter explicitement ici

5
Joop