Mezclar una lista de objetos [duplicado]
¿Cómo mezclo una lista de objetos? Lo intenté random.shuffle
:
import random
b = [object(), object()]
print(random.shuffle(b))
Pero produce:
None
random.shuffle
Deberia trabajar. Aquí hay un ejemplo, donde los objetos son listas:
from random import shuffle
x = [[i] for i in range(10)]
shuffle(x)
print(x)
# print(x) gives [[9], [2], [7], [0], [4], [5], [3], [1], [8], [6]]
Tenga en cuenta que shuffle
funciona en su lugar y regresa None
.
De manera más general, en Python, los objetos mutables se pueden pasar a funciones, y cuando una función muta esos objetos, el estándar es devolver None
(en lugar de, por ejemplo, el objeto mutado).
Como habrás aprendido, el problema era la mezcla in situ. También tengo problemas con frecuencia y, a menudo, también parezco olvidar cómo copiar una lista. Usar sample(a, len(a))
es la solución, usar len(a)
como tamaño de muestra. Consulte https://docs.python.org/3.6/library/random.html#random.sample para obtener la documentación de Python.
Aquí hay una versión simple random.sample()
que devuelve el resultado mezclado como una nueva lista.
import random
a = range(5)
b = random.sample(a, len(a))
print a, b, "two list same:", a == b
# print: [0, 1, 2, 3, 4] [2, 1, 3, 4, 0] two list same: False
# The function sample allows no duplicates.
# Result can be smaller but not larger than the input.
a = range(555)
b = random.sample(a, len(a))
print "no duplicates:", a == list(set(b))
try:
random.sample(a, len(a) + 1)
except ValueError as e:
print "Nope!", e
# print: no duplicates: True
# print: Nope! sample larger than population