2011-10-28 22 views
14

C'è un modo semplice per restituire un array shuffled in Python piuttosto che mischiarlo sul posto?Shuffle in Python

per esempio, invece di

x = [array] 
random.shuffle(x) 

che sto cercando qualcosa di simile

y = shuffle(x) 

che mantiene x.

nota, io non sono alla ricerca di una funzione, non è qualcosa di simile:

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

Discusso in un post su Python-ideas nel 2009, scoraggiato perché puoi scrivere 'y = ordinato (yourList, key = lambda x: random.random())'. Vedi: http://mail.python.org/pipermail/python-ideas/2009-March/003661.html –

risposta

17

sorted con una funzione key che restituisce un valore casuale:

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

O

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

Questo è breve, ma scala come O (n log n), mentre la copia della lista di input seguita da 'random.shuffle' è O (n). Riferimento: http: //en.wikipedia.org/wiki/Shuffling # Shuffling_algorithms – EOL

+0

L'esecuzione di quest'ultimo su una matrice di stringhe ha provocato: ordinati (a, key = os.urandom) TypeError: l'oggetto 'str' non può essere interpretato come un numero intero. Fare il primo ha funzionato come previsto. Mi chiedo se c'è un modo per fare quest'ultimo su una serie di archi? – ntk4

8

Basta scrivere il proprio.

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

Grazie, ma sto cercando di risparmiare fatica - dover includere questo in tutti i programmi che scrivo è uno sforzo maggiore rispetto all'utilizzo della formulazione originale. – Jeff

+1

Vuoi che aggiunga magicamente qualcosa alla libreria standard di Python? Perché hai bisogno di copie * casuali * in "tutti i programmi" che scrivi comunque? – FogleBird

+6

Non voglio che tu faccia magicamente qualcosa, stavo solo chiedendo se una tale funzione esistesse in una libreria standard. Non ho bisogno di copie di per sé, mi piacerebbe definire un array come x = shuffled ([1 2 3 4 5]) piuttosto che doverlo definire su due righe. – Jeff

5

Non c'è nessuna funzione che si sta cercando. Basta copiare un elenco.

11

Sarebbe molto semplice implementare la propria utilizzando random. Vorrei scrivere come segue:

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

+1: questo è O (n), mentre il 'ordinato (..., key = os.urandom)' è in O (n log n). – EOL

2

Si potrebbe utilizzare sia per numpy.random.permutation una lista o un array, ma è la funzione giusta se hai già una matrice numpy. Per gli elenchi con tipi misti, la conversione in una serie numpy eseguirà conversioni di tipo.

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

Questa è la migliore soluzione a questa domanda! – Ohumeronen

0

Usando questo come demo altrove quindi ho pensato che potrebbe essere la pena di condivisione:

import random 

x = shuffleThis(x) 


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

Spero che questo è utile.