¿Por qué el método set() de Python ordena una lista en algunos casos?
Estoy confundido/a por el comportamiento de set()
en Python en este ejemplo:
random_number_list = [randint(1, 10) for _ in range(10)]
<h1>¡Esto estará ordenado!</h1>
unique_numbers = set(random_number_list)
print(
f"Lista de números aleatorios/ números únicos con el mismo límite superior para randint() y range():\n{random_number_list=}\n{unique_numbers=}\n"
)
random_number_list = [randint(1, 100) for _ in range(10)]
<h1>Esto no estará ordenado.</h1>
unique_numbers = set(random_number_list)
print(
f"Lista de números aleatorios/ números únicos con límite superior diferente para randint() y range():\n{random_number_list=}\n{unique_numbers=}\n"
)
Parece que set()
está ordenando la lista random_number_list
si la longitud de la lista y el límite superior de randint()
son iguales:
➜ ch-2 python --version
Python 3.10.0
➜ ch-2 python find_k_smallest.py
Lista de números aleatorios/ números únicos con el mismo límite superior para randint() y range():
random_number_list=[10, 1, 2, 5, 5, 7, 8, 8, 2, 8]
unique_numbers={1, 2, 5, 7, 8, 10}
Lista de números aleatorios/ números únicos con límite superior diferente para randint() y range():
random_number_list=[35, 1, 17, 26, 17, 74, 26, 11, 44, 13]
unique_numbers={1, 35, 74, 11, 44, 13, 17, 26}
La documentación dice:
Un objeto de tipo set es una colección desordenada de objetos hashables y distintos.
¿Qué está sucediendo aquí? ¿Por qué set()
ordena la lista random_number_list
en algunos casos y en otros no?
Editar Ninguna de estas preguntas aborda mi problema:
- https://stackoverflow.com/questions/63845073/my-python-multiprocesses-are-apparently-not-independent/64866191#64866191
- https://stackoverflow.com/questions/1653970/does-python-have-an-ordered-set
davy.ai
La función
set()
en Python no garantiza ningún orden específico para sus elementos. Sin embargo, en este ejemplo específico, parece queset()
está ordenando la listarandom_number_list
cuando la longitud de la lista y el límite superior derandint()
son iguales. Esto se debe a que cuando el límite superior derandint()
es igual a la longitud de la lista, no habrá duplicados en la lista yset()
ordena los elementos de forma ascendente en este caso. Cuando el límite superior derandint()
es mayor que la longitud de la lista, hay una mayor probabilidad de que haya duplicados, yset()
no necesariamente ordena los elementos.En resumen, el comportamiento de
set()
en cuanto al ordenamiento de sus elementos no está garantizado y no está relacionado específicamente con el uso derandom
,list
oset
. Simplemente sucede que es coincidente en este ejemplo en particular.