Tengo una lista de objetos y quiero barajarlos. Pensé que podría usar el random.shuffle
método, pero esto parece fallar cuando la lista es de objetos. ¿Hay algún método para barajar objetos u otra forma de evitar esto?
import random
class A:
foo = "bar"
a1 = a()
a2 = a()
b = [a1, a2]
print(random.shuffle(b))
Esto fallará.
Respuestas:
random.shuffle
Deberia trabajar. Aquí hay un ejemplo, donde los objetos son listas:Tenga en cuenta que shuffle funciona en su lugar y devuelve None.
fuente
random
documentación del módulo .random.sample(x, len(x))
o simplemente hacer una copia yshuffle
eso. Para lolist.sort
cual tiene un problema similar, ahora haylist.sorted
, pero no hay una variante similar parashuffle
.from random import SystemRandom
en su lugar; agreguecryptorand = SystemRandom()
y cambie la fila 3 acryptorand.shuffle(x)
Como aprendiste, el problema era el barajar en el lugar. También tengo problemas con frecuencia y, a menudo, parece olvidar también cómo copiar una lista. Usar
sample(a, len(a))
es la solución, usarlen(a)
como tamaño de muestra. Consulte https://docs.python.org/3.6/library/random.html#random.sample para la documentación de Python.Aquí hay una versión simple usando
random.sample()
que devuelve el resultado barajado como una nueva lista.fuente
old = [1,2,3,4,5]; new = list(old); random.shuffle(new); print(old); print(new)
(reemplace; con nuevas líneas)old[:]
También podría hacer una copia superficial para la listaold
.sample()
es particularmente útil para crear prototipos en un análisis de datos.sample(data, 2)
para configurar el código de pegamento de una tubería, luego "ensancharlo" paso a paso, hastalen(data)
.Me tomó un tiempo entender eso también. Pero la documentación para barajar es muy clara:
Entonces no deberías
print(random.shuffle(b))
. En cambio, hazlorandom.shuffle(b)
y luegoprint(b)
.fuente
fuente
Si ya estás usando numpy (muy popular para aplicaciones científicas y financieras), puedes ahorrarte una importación.
http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.shuffle.html
fuente
Funciona bien para mí. Asegúrese de establecer el método aleatorio.
fuente
Si tiene varias listas, es posible que desee definir primero la permutación (la forma de barajar la lista / reorganizar los elementos de la lista) y luego aplicarla a todas las listas:
Numpy / Scipy
Si sus listas son matrices numpy, es más simple:
mpu
He creado el pequeño paquete de utilidad
mpu
que tiene laconsistent_shuffle
función:Tenga en cuenta que
mpu.consistent_shuffle
toma un número arbitrario de argumentos. Por lo tanto, también puede barajar tres o más listas con él.fuente
Esta alternativa puede ser útil para algunas aplicaciones en las que desea intercambiar la función de pedido.
fuente
sorted
, esta es una combinación funcional (si le gusta ese tipo de cosas).En algunos casos, cuando se usan matrices numpy, se usan
random.shuffle
datos duplicados creados en la matriz.Una alternativa es usar
numpy.random.shuffle
. Si ya está trabajando con numpy, este es el método preferido sobre el genéricorandom.shuffle
.numpy.random.shuffle
Ejemplo
Utilizando
random.shuffle
:Utilizando
numpy.random.shuffle
:fuente
numpy.random.permutation
puede ser de interés: stackoverflow.com/questions/15474159/shuffle-vs-permute-numpyrandom.shuffle
la documentación debe gritar No utilizar con matrices numpyPara líneas simples, use
random.sample(list_to_be_shuffled, length_of_the_list)
con un ejemplo:salidas: [2, 9, 7, 8, 3, 0, 4, 1, 6, 5]
fuente
'print func (foo)' imprimirá el valor de retorno de 'func' cuando se llame con 'foo'. 'shuffle' sin embargo tiene None como su tipo de retorno, ya que la lista se modificará en su lugar, por lo tanto, no imprime nada. Solución alterna:
Si le gusta más el estilo de programación funcional, es posible que desee realizar la siguiente función de contenedor:
fuente
random.sample(ls, len(ls))
si realmente quisieras seguir esa ruta.Se puede definir una función llamada
shuffled
(en el mismo sentido desort
vssorted
)fuente
shuffle
está en su lugar, así que no imprima el resultado, que esNone
, sino la lista.fuente
Puedes ir por esto:
si desea volver a dos listas, luego divida esta larga lista en dos.
fuente
podría crear una función que tome una lista como parámetro y devuelva una versión aleatoria de la lista:
fuente
fuente
puedes usar shuffle o sample. los cuales provienen de un módulo aleatorio.
O
fuente
Asegúrese de no nombrar su archivo fuente random.py, y de que no haya un archivo en su directorio de trabajo llamado random.pyc .. cualquiera de los dos podría hacer que su programa intente importar su archivo random.py local en lugar del módulo aleatorio pythons .
fuente
fuente
_list.extend(list2)
, que es más sucinto y más eficiente.fuente
El proceso de barajado es "con reemplazo" , por lo que la aparición de cada elemento puede cambiar. Al menos cuando los elementos de tu lista también están en la lista.
P.ej,
Después,
El número de [0] puede ser 9 u 8, pero no exactamente 10.
fuente
Plan: escriba la barajadura sin depender de una biblioteca para hacer el trabajo pesado. Ejemplo: revise la lista desde el principio comenzando con el elemento 0; encuentre una nueva posición aleatoria para él, digamos 6, ponga el valor de 0 en 6 y el valor de 6 en 0. Pase al elemento 1 y repita este proceso, y así sucesivamente en el resto de la lista
fuente
my_list[i], my_list[j] = my_list[j], my_list[i]
Funciona bien. Lo estoy intentando aquí con funciones como objetos de lista:
Imprime: foo1 foo2 foo3 foo2 foo3 foo1 (los foos en la última fila tienen un orden aleatorio)
fuente