python - array - ¿Por qué random.shuffle devuelve None?
shuffle list c# (8)
Creo que este método también funciona.
import random
shuffled = random.sample(original, len(original))
¿Por qué random.shuffle
devuelve None
en python?
>>> x = [''foo'',''bar'',''black'',''sheep'']
>>> from random import shuffle
>>> print shuffle(x)
None
¿Cómo obtengo el valor mezclado en lugar de None
?
De acuerdo con los docs :
Mezcle la secuencia x en su lugar. El argumento opcional random es una función de argumento 0 que devuelve un flotante aleatorio en [0.0, 1.0); por defecto, esta es la función random ().
>>> x = [''foo'',''bar'',''black'',''sheep'']
>>> from random import shuffle
>>> shuffle(x)
>>> x
[''bar'', ''black'', ''sheep'', ''foo'']
Las API de Python que cambian la estructura en su lugar devuelve None como salida.
list = [1,2,3,4,5,6,7,8]
print(list)
Salida: [1, 2, 3, 4, 5, 6, 7, 8]
from random import shuffle
print(shuffle(list))
Salida: ninguna
from random import sample
print(sample(list, len(list)))
Salida: [7, 3, 2, 4, 5, 6, 1, 8]
Puede devolver la lista mezclada usando random.sample()
como lo explicaron los demás. Funciona al muestrear k elementos de la lista sin reemplazo . Entonces, si hay elementos duplicados en su lista, serán tratados de manera única.
>>> l = [1,4,5,3,5]
>>> random.sample(l,len(l))
[4, 5, 5, 3, 1]
>>> random.sample(l,len(l)-1)
[4, 1, 5, 3]
>>> random.sample(l,len(l)-1)
[3, 5, 5, 1]
Tuve mi momento de aha con este concepto así:
from random import shuffle
x = [''foo'',''black'',''sheep''] #original list
y = list(x) # an independent copy of the original
for i in range(5):
print shuffle(y) # shuffles the original "in place" prints "None" return
print x,y #prints original, and shuffled independent copy
>>>
None
[''foo'', ''black'', ''sheep''] [''foo'', ''black'', ''sheep'']
None
[''foo'', ''black'', ''sheep''] [''black'', ''foo'', ''sheep'']
None
[''foo'', ''black'', ''sheep''] [''sheep'', ''black'', ''foo'']
None
[''foo'', ''black'', ''sheep''] [''black'', ''foo'', ''sheep'']
None
[''foo'', ''black'', ''sheep''] [''sheep'', ''black'', ''foo'']
random.shuffle()
cambia la lista x
en su lugar .
Los métodos de Python API que alteran una estructura in situ generalmente devuelven None
, no la estructura de datos modificada.
Si desea crear una nueva lista aleatoriamente basada en una existente, donde la lista existente se mantiene en orden, puede usar random.sample()
con la longitud completa de la entrada:
x = [''foo'', ''bar'', ''black'', ''sheep'']
random.sample(x, len(x))
También puede usar sorted()
con random.random()
para una clave de clasificación:
shuffled = sorted(x, key=lambda k: random.random())
pero esto invoca ordenación (una operación O (NlogN)), mientras que el muestreo a la longitud de entrada solo toma operaciones O (N) random.shuffle()
se usa el mismo proceso que random.shuffle()
, intercambiando valores aleatorios de un grupo de contracción).
Manifestación:
>>> import random
>>> x = [''foo'', ''bar'', ''black'', ''sheep'']
>>> random.sample(x, len(x))
[''bar'', ''sheep'', ''black'', ''foo'']
>>> sorted(x, key=lambda k: random.random())
[''sheep'', ''foo'', ''black'', ''bar'']
>>> x
[''foo'', ''bar'', ''black'', ''sheep'']
shuffle
modifica la lista en su lugar. Esto es bueno, porque copiar una lista grande sería una sobrecarga pura si ya no necesitas la lista original.
Según el principio "explícito es mejor que implícito" del estilo pitónico , devolver la lista sería una mala idea, porque entonces uno podría pensar que es una nueva, aunque en realidad no lo es.
Si necesita una nueva lista, tendrá que escribir algo como
new_x = list(x) # make a copy
random.shuffle(new_x)
que es muy explícito Si necesita este modismo con frecuencia, envuélvalo en una función shuffled
(vea sorted
) que devuelva new_x
.
shuffle(x)
no devuelve ningún valor En cambio, esa función mezcla la variable en sí misma.
Entonces no lo intentes
print shuffle(x)
en su lugar solo imprime la variable como esta.
>>> x = [''foo'',''bar'',''black'',''sheep'']
>>> from random import shuffle
>>> x
[''bar'', ''black'', ''foo'', ''sheep'']