Mezclar una lista de objetos [duplicado]

Resuelto utdiscant asked hace 15 años • 26 respuestas

¿Cómo mezclo una lista de objetos? Lo intenté random.shuffle:

import random

b = [object(), object()]

print(random.shuffle(b))

Pero produce:

None
utdiscant avatar Jun 10 '09 23:06 utdiscant
Aceptado

random.shuffleDeberia 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 shufflefunciona 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).

tom10 avatar Jun 10 '2009 17:06 tom10

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
Ted avatar Oct 19 '2012 16:10 Ted