2011-10-28 9 views
14

¿Existe una manera directa de DEVOLVER una matriz mezclada en Python en lugar de barajarla en su lugar?Reproducción aleatoria en Python

por ejemplo, en lugar de

x = [array] 
random.shuffle(x) 

estoy buscando algo como

y = shuffle(x) 

que mantiene x.

Nota, yo no busco a una función, no algo como:

x=[array] 
y=x 
random.shuffle(x) 
+2

Discutido en una publicación sobre python-ideas en 2009, desaconsejado porque puede escribir 'y = ordenado (suLista, clave = lambda x: random.random())'. Ver: http://mail.python.org/pipermail/python-ideas/2009-March/003661.html –

Respuesta

17

sorted con una función key que devuelve un valor aleatorio:

import random 
sorted(l, key=lambda *args: random.random()) 

O

import os 
sorted(l, key=os.urandom) 
+13

Esto es corto, pero se escala como O (n log n), mientras que la copia de la lista de entrada seguida de 'random.shuffle' es O (n). Referencia: http: //en.wikipedia.org/wiki/Shuffling # Shuffling_algorithms – EOL

+0

Hacer esto último en una matriz de cadenas resultó en: sorted (a, key = os.urandom) TypeError: el objeto 'str' no puede interpretarse como un entero. Hacer lo primero funcionó como se esperaba. Me pregunto si hay una manera de hacer esto último en una serie de cadenas. – ntk4

8

Sólo tiene que escribir el suyo propio.

import random 

def shuffle(x): 
    x = list(x) 
    random.shuffle(x) 
    return x 

x = range(10) 
y = shuffle(x) 
print x # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
print y # [2, 5, 0, 4, 9, 3, 6, 1, 7, 8] 
+0

Gracias, pero estoy tratando de ahorrar esfuerzo, tener que incluir esto en todos los programas que escribo es más esfuerzo que solo usar la formulación original. – Jeff

+1

¿Quieres que agregue mágicamente algo a la biblioteca estándar de Python? ¿Por qué necesita barajar * copias * en "todos los programas" que escribe de todos modos? – FogleBird

+6

No quiero que hagas nada mágicamente, solo preguntaba si existía tal función en una biblioteca estándar. No necesito copias per se, me gustaría definir una matriz como x = barajada ([1 2 3 4 5]) en lugar de tener que definirla en dos líneas. – Jeff

5

No hay ninguna función que esté buscando. Solo copia una lista.

11

Sería bastante simple implementar su propio uso de random. Lo escribiría de la siguiente manera:

def shuffle(l): 
    l2 = l[:]   #copy l into l2 
    random.shuffle(l2) #shuffle l2 
    return l2   #return shuffled l2 
+2

+1: esto es O (n), mientras que el 'ordenado (..., clave = os.urandom)' está en O (n log n). – EOL

2

usted podría utilizar, ya sea para numpy.random.permutation una lista o matriz, pero es la función correcta si ya tienes una matriz numpy. Para listas con tipos mixtos, la conversión a una matriz numpy hará conversiones tipo.

import numpy as np 
my_list = ['foo', 'bar', 'baz', 42] 
print list(np.random.permutation(my_list)) 
# ['bar', 'baz', '42', 'foo'] 
+0

¡Esta es la mejor solución a esta pregunta! – Ohumeronen

0

Usando esto como una demostración en otro lugar así que pensamos que puede valer la pena compartir:

import random 

x = shuffleThis(x) 


def shuffleThis(y): 
    random.shuffle(y) 
    return(y) 
#end of Shuffle Function 

Hope esto es útil.

Cuestiones relacionadas