Son los conjuntos ordenados como dicts en python3.6

Debido a los cambios en la implementación de dict en Python 3.6, ahora está ordenado de forma predeterminada. ¿Se set el orden de preservar también ahora?

No pude encontrar ninguna información al respecto, pero como ambas estructuras de datos son muy similares en la forma en que funcionan bajo el capó, pensé que podría ser el caso.

Sé que no hay promesa de que se ordenen dictados en todos los casos, pero la mayoría de las veces lo son. Como se indica en los documentos de Python:

El aspecto de conservación de orden de esta nueva implementación se considera un detalle de implementación y no se debe confiar en él

No, los set s todavía no están ordenados.

Puede verificar esto simplemente mostrando un set que debería tener un “orden de troceo bien definido” 1 para asegurarse de que no obtengamos accidentalmente un set que parezca ordenado pero en realidad no lo es:

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

Si se ordenara, esperaría {3, 2, 1} y [3, 2, 1] como resultado de los ejemplos.

Mientras que los dict s están ordenados (el mismo ejemplo, solo un poco modificado):

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

1 “orden hash bien definido”:

Para enteros que satisfacen 0 <= integer < sys.hash_info.modulus el hash es solo el número en sí. Eso significa que si el conjunto está ordenado "basado" en el hash (y no ordenado según el "tiempo" de inserción) y los valores de hash no chocan (por eso usé números pequeños y números que solo difieren en uno) el orden Debería ser determinista porque ocupan espacios dentro del conjunto que están uno al lado del otro:

  • De menor a mayor
  • o desde un valor específico al más alto y luego desde el más pequeño al valor específico. Este caso ocurre si la siguiente ranura libre (en el sentido de vecina) en el conjunto es la primera.

Como ejemplo para este último:

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

set s no están ordenados en Python 3.6, ni siquiera como detalle de implementación de CPython. Un ejemplo simple ilustra esto:

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

Los documentos de Python 3 son claros en esto:

Un conjunto es una colección desordenada sin elementos duplicados.