Pregunta Mezclando una lista de objetos


Tengo una lista de objetos en Python y quiero mezclarlos. 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 mezclar 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á


519
2018-06-10 16:56


origen


Respuestas:


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  gives  [[9], [2], [7], [0], [4], [5], [3], [1], [8], [6]]
# of course your results will vary

Tenga en cuenta que la reproducción aleatoria funciona en su lugary devuelve None.


857
2018-06-10 17:03



Como aprendiste, el barajado en el lugar era el problema. También tengo problemas con frecuencia y, a menudo, también me olvido de cómo copiar una lista. Utilizando sample(a, len(a)) es la solución, usando len(a) como el tamaño de muestra. Ver 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 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

88
2017-10-19 16:50



Me tomó algo de tiempo obtener eso también. Pero la documentación para shuffle es muy clara:

lista aleatoria x en su lugar; devolver ninguno

Entonces no deberías print random.shuffle(b). En lugar de hacer random.shuffle(b) y entonces print b.


31
2017-11-21 14:49



#!/usr/bin/python3

import random

s=list(range(5))
random.shuffle(s) # << shuffle before print or assignment
print(s)

# print: [2, 4, 1, 3, 0]

30
2017-12-04 12:46



>>> import random
>>> a = ['hi','world','cat','dog']
>>> random.shuffle(a,random.random)
>>> a
['hi', 'cat', 'dog', 'world']

Funciona bien para mí. Asegúrese de establecer el método aleatorio.


19
2018-06-10 17:04



Si ya usa numpy (muy popular para aplicaciones científicas y financieras), puede ahorrarse una importación.

import numpy as np    
np.random.shuffle(b)
print(b)

http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.shuffle.html


16
2018-02-28 02:35



Si tiene varias listas, es posible que desee definir primero la permutación (la forma de mezclar la lista / reorganizar los elementos de la lista) y luego aplicarla a todas las listas:

import random

perm = list(range(len(list_one)))
random.shuffle(perm)
list_one = [list_one[index] for index in perm]
list_two = [list_two[index] for index in perm]

Numpy / Scipy

Si sus listas son matrices numpy, es más simple:

import numpy as np

perm = np.random.permutation(len(list_one))
list_one = list_one[perm]
list_two = list_two[perm]

mpu

Creé el pequeño paquete de utilidades mpu que tiene el consistent_shuffle función:

import mpu

# Necessary if you want consistent results
import random
random.seed(8)

# Define example lists
list_one = [1,2,3]
list_two = ['a', 'b', 'c']

# Call the function
list_one, list_two = mpu.consistent_shuffle(list_one, list_two)

Tenga en cuenta que mpu.consistent_shuffle toma una cantidad arbitraria de argumentos. Entonces también puedes mezclar tres o más listas con él.


8
2018-02-05 16:15



from random import random
my_list = range(10)
shuffled_list = sorted(my_list, key=lambda x: random())

Esta alternativa puede ser útil para algunas aplicaciones en las que desea intercambiar la función de ordenar.


6
2018-05-06 00:04



'print func (foo)' imprimirá el valor de retorno de 'func' cuando se llame con 'foo'. 'shuffle' sin embargo tiene None como su tipo de devolución, ya que la lista se modificará en su lugar, por lo tanto, no imprime nada. Solución:

# shuffle the list in place 
random.shuffle(b)

# print it
print(b)

Si está más interesado en el estilo de programación funcional, es posible que desee realizar la siguiente función de envoltura:

def myshuffle(ls):
    random.shuffle(ls)
    return ls

5
2018-05-24 14:59



En algunos casos cuando se usan matrices numpy, usando random.shuffle creado datos duplicados 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érico random.shuffle.

numpy.random.shuffle

Ejemplo

>>> import numpy as np
>>> import random

Utilizando random.shuffle:

>>> foo = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> foo

array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])


>>> random.shuffle(foo)
>>> foo

array([[1, 2, 3],
       [1, 2, 3],
       [4, 5, 6]])

Utilizando numpy.random.shuffle:

>>> foo = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> foo

array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])


>>> np.random.shuffle(foo)
>>> foo

array([[1, 2, 3],
       [7, 8, 9],
       [4, 5, 6]])

4
2017-12-19 17:01



Uno puede definir una función llamada shuffled (en el mismo sentido de sort vs sorted)

def shuffled(x):
    import random
    y = x[:]
    random.shuffle(y)
    return y

x = shuffled([1, 2, 3, 4])
print x

2
2018-05-06 00:48