¿Por qué el orden de iteración de un conjunto de Python (con los mismos contenidos) varía de ejecución a ejecución y cuáles son mis opciones para que sea consistente desde la ejecución hasta la ejecución?Establecer el orden de iteración varía de ejecución a ejecución
Entiendo que el orden de iteración para un conjunto de Python es arbitrario. Si pongo 'a', 'b' y 'c' en un conjunto y luego los repito, pueden volver a aparecer en cualquier orden.
Lo que he observado es que el orden sigue siendo el mismo dentro de una ejecución del programa. Es decir, si mi programa itera el mismo conjunto dos veces seguidas, obtengo el mismo orden las dos veces. Sin embargo, si ejecuto el programa dos veces seguidas, el orden cambia de ejecución a ejecución.
Desafortunadamente, esto rompe una de mis pruebas automáticas, que simplemente compara la salida de dos ejecuciones de mi programa. No me importa el orden real, pero me gustaría que sea consistente desde la ejecución hasta la ejecución.
La mejor solución que he llegado con es:
- Copia el conjunto a una lista.
- Aplicar una ordenación arbitraria a la lista.
- Iterate la lista en lugar del conjunto.
¿Existe una solución más simple?
Nota: He encontrado preguntas similares en StackOverlow, pero ninguna que resuelva este problema específico de obtener los mismos resultados de la ejecución para ejecutarse.
Si lo que está probando es que "el programa genera lo mismo dos veces", la opción de lista ordenada es su mejor opción. Si lo que está probando es que "el programa crea el mismo conjunto en ambas ocasiones", tendrá que hacer una comparación de conjuntos (reduciendo la producción de ambas ejecuciones, desatornillando la salida de ambas y estableciendo comparaciones entre ellas, o algo moralmente equivalente). –
@Russell: Tengo pruebas unitarias que verifican los contenidos establecidos. Pero también tengo esta prueba que compara la salida de dos carreras como una verificación de cordura. El resultado depende, en parte, del orden de los elementos en un conjunto, pero solo de forma indirecta. –