Me sorprendió descubrir recientemente que, si bien se garantiza que los dictados conservan el orden de inserción en Python 3.7+, los conjuntos no lo son:
>>> d = {'a': 1, 'b': 2, 'c': 3} >>> d {'a': 1, 'b': 2, 'c': 3} >>> d['d'] = 4 >>> d {'a': 1, 'b': 2, 'c': 3, 'd': 4} >>> s = {'a', 'b', 'c'} >>> s {'b', 'a', 'c'} >>> s.add('d') >>> s {'d', 'b', 'a', 'c'}¿Cuál es la razón de esta diferencia? ¿Las mismas mejoras de eficiencia que llevaron al equipo de Python a cambiar la implementación de dict no se aplican también a los conjuntos?
No estoy buscando punteros a implementaciones de conjuntos ordenados o formas de usar dictados como suplentes para conjuntos. Me pregunto por qué el equipo de Python no hizo que los conjuntos incorporados conservaran el orden al mismo tiempo que lo hicieron para los dictados.
Discusiones
Su pregunta es pertinente y ya se ha discutido mucho en python-devs no hace mucho tiempo. R. Hettinger compartió una lista de razones en ese hilo . El estado de la cuestión parece abierto ahora, poco después de esta respuesta detallada de T. Peters.
En resumen, la implementación de dictados modernos que preservan el orden de inserción es única y no se considera apropiada con conjuntos. En particular, los dictados se usan en todas partes para ejecutar Python (por ejemplo __dict__ en espacios de nombres de objetos). Una de las principales motivaciones detrás del dict moderno fue reducir el tamaño, lo que hace que Python sea más eficiente en términos de memoria en general. Por el contrario, los conjuntos son menos frecuentes que los dictados dentro del núcleo de Python y, por lo tanto, disuaden de tal refactorización. Véase también la charla de R. Hettinger sobre la implementación moderna de dictados.
Perspectivas
La naturaleza desordenada de los conjuntos en Python es paralela al comportamiento de los conjuntos matemáticos . El orden no está garantizado.
El concepto matemático correspondiente está desordenado y sería extraño imponer tal orden - R. Hettinger
Si se introdujera orden de cualquier tipo en los conjuntos en Python, entonces este comportamiento cumpliría con una estructura matemática completamente separada, a saber, un conjunto ordenado (u Oset). Los osets juegan un rol separado en matemáticas, particularmente en combinatoria. Una aplicación práctica de Osets se observa en el cambio de campanas .
Tener conjuntos desordenados es consistente con una estructura de datos muy genérica y omnipresente que desancla la mayoría de las matemáticas modernas, es decir, la teoría de conjuntos . Envié, es bueno tener conjuntos desordenados en Python.
Ver también publicaciones relacionadas que amplían este tema: