41 votes

Les ensembles sont-ils ordonnés comme des dicts dans python3.6 ?

En raison des changements dans dict dans Python 3.6, il est maintenant ordonné par défaut. Faites set s préserver l'ordre aussi bien maintenant ?

Je n'ai pas trouvé d'informations à ce sujet, mais comme ces deux structures de données sont très similaires dans leur fonctionnement, j'ai pensé que cela pourrait être le cas.

Je sais qu'il n'y a aucune promesse pour dict doivent être commandés dans tous les cas, mais ils le sont la plupart du temps. Comme indiqué dans la documentation de Python :

L'aspect de préservation de l'ordre de cette nouvelle mise en œuvre est considéré comme un détail de mise en œuvre et ne doit pas être pris en compte.

0 votes

@byxor Vous ne devez pas dépendre de au hasard ordre, les ensembles sont arbitrairement ordonné mais loin d'être aléatoire en raison du hachage

0 votes

Si vous êtes intéressé par pourquoi les ensembles ne sont pas ordonnés par insertion, voir Pourquoi les ensembles Python ne préservent-ils pas l'ordre d'insertion ?

29voto

MSeifert Points 6307

Non, set sont toujours non ordonnées.

Vous pouvez le vérifier en affichant simplement un set qui devrait avoir un "ordre de hachage bien défini" 1 pour s'assurer que nous ne recevons pas accidentellement une set qui semble ordonné mais qui ne l'est pas :

>>> a_set = {3,2,1}
>>> a_set
{1, 2, 3}
>>> list(a_set)
[1, 2, 3]

Si elle était commandée, vous vous attendriez à {3, 2, 1} y [3, 2, 1] à la suite de ces exemples.

Alors que dict sont en fait ordonnés (même exemple légèrement modifié) :

>>> a_dict = {3: 3, 2: 2, 1:1}
>>> a_dict
{3: 3, 2: 2, 1: 1}
>>> list(a_dict)
[3, 2, 1]

1 "ordre de hachage bien défini" :

Pour les entiers qui satisfont 0 <= integer < sys.hash_info.modulus le site hash est juste le nombre lui-même. Cela signifie que si l'ensemble est ordonné "sur la base" du hachage (et non sur la base du "temps" d'insertion) et que les valeurs de hachage n'entrent pas en collision (c'est pourquoi j'ai utilisé des petits nombres et des nombres qui ne diffèrent que d'un seul), l'ordre devrait être déterministe parce qu'ils occupent des emplacements dans l'ensemble qui sont proches les uns des autres :

  • Soit du plus petit au plus grand
  • ou d'une valeur spécifique à la plus élevée, puis de la plus petite à la valeur spécifique. Ce cas se produit si l'emplacement libre suivant (au sens de voisin) dans le jeu est le premier.

A titre d'exemple pour ce dernier point :

>>> a_set = {6,7,8,9}
>>> a_set
{8, 9, 6, 7}

0 votes

Négatif int sont également hachées pour elles-mêmes (à l'exception de -1 ), bien que je ne sois pas sûr de la limite inférieure exacte.

1 votes

@Chris_Rands Oui, mais parce que -1 y -2 les deux hachent vers -2 il y a une collision :)

1 votes

Oui et -1 se comporte de cette façon parce que c'est un code d'erreur en C ; je crois que la limite est (sys.maxsize // 4) - 1 C'est du moins ce que Martijn Pieters m'a dit précédemment.

12voto

Chris_Rands Points 15161

set ne sont pas ordonnés dans Python 3.6, même pas en tant que détail d'implémentation de CPython. Un exemple simple illustre cela :

>>> import string
>>> string.digits
'0123456789'
>>> set(string.digits)
{'7', '0', '2', '8', '6', '9', '1', '5', '4', '3'}

Le Python 3 docs sont claires à ce sujet :

Un ensemble est une collection non ordonnée dont les éléments ne sont pas en double.

0 votes

Mais les documents sur dict disent également que "Il est préférable de considérer un dictionnaire comme une non ordonné ensemble de paires clé : valeur, avec l'exigence que les clés soient uniques (dans un même dictionnaire)". ( fuente ). C'est juste la spécification du langage, l'implémentation podría être commandé...

0 votes

@MSeifert "best to think of" est la formulation clé je pense, il n'y a pas de telle mise en garde pour l'outil de gestion de l'environnement. set docs

0 votes

Je pensais que c'était juste du "fluff" (ou inclus parce que PyPy avait un dictionnaire ordonné depuis longtemps). Mais, comme je l'ai dit, c'est juste la spécification du langage. Cela ne signifie pas qu'une implémentation pourrait l'implémenter d'une manière ordonnée (c'est-à-dire avec des seaux ou similaires).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X