python - array - shuffle list c#
Barajando una lista de objetos (23)
''print func (foo)'' imprimirá el valor de retorno de ''func'' cuando se llame con ''foo''. Sin embargo, ''shuffle'' tiene None como su tipo de retorno, ya que la lista se modificará en su lugar, por lo que 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 envoltorio:
def myshuffle(ls):
random.shuffle(ls)
return ls
Tengo una lista de objetos en Python y quiero barajarlos. Pensé que podría usar el método random.shuffle
, pero esto parece fallar cuando la lista es de objetos. ¿Hay un 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 va a fallar.
Asegúrese de que no está asignando un nombre al archivo de origen random.py, y que no hay un archivo en su directorio de trabajo llamado random.pyc. Esto podría hacer que su programa intente importar su archivo random.py local en lugar de un módulo aleatorio de pythons .
Como aprendiste, el problema fue el barajar in situ. También tengo problemas con frecuencia y, a menudo, parece que también me olvido de cómo copiar una lista. Usar la sample(a, len(a))
es la solución, usando len(a)
como el tamaño de la muestra. Consulte https://docs.python.org/3.6/library/random.html#random.sample para ver la documentación de Python.
Aquí hay una versión simple que usa random.sample()
que devuelve el resultado barajado 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
En algunos casos, al usar matrices numpy, el uso de random.shuffle
creó datos duplicados en la matriz.
Una alternativa es usar numpy.random.shuffle
. Si ya está trabajando con numpy, este es el método preferido en lugar de random.shuffle
genérico.
Ejemplo
>>> import numpy as np
>>> import random
Usando 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]])
Funciona bien. Lo estoy probando aquí con funciones como objetos de lista:
from random import shuffle
def foo1():
print "foo1",
def foo2():
print "foo2",
def foo3():
print "foo3",
A=[foo1,foo2,foo3]
for x in A:
x()
print "/r"
shuffle(A)
for y in A:
y()
Se imprime: foo1 foo2 foo3 foo2 foo3 foo1 (los foos en la última fila tienen un orden aleatorio)
Me tomó algo de tiempo conseguir eso también. Pero la documentación para barajar es muy clara:
barajar la lista x en su lugar ; devuelve ninguno.
Así que no debes print random.shuffle(b)
. En su lugar, haga random.shuffle(b)
y luego print b
.
Para las de una sola línea, use random.sample(list_to_be_shuffled, length_of_the_list)
con un ejemplo:
import random
random.sample(list(range(10)), 10)
salidas: [2, 9, 7, 8, 3, 0, 4, 1, 6, 5]
Plan: escriba el orden aleatorio sin depender de una biblioteca para hacer el trabajo pesado. Ejemplo: recorra 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. Vaya al elemento 1 y repita este proceso, y así sucesivamente hasta el resto de la lista
import random
iteration = random.randint(2, 100)
temp_var = 0
while iteration > 0:
for i in range(1, len(my_list)): # have to use range with len()
for j in range(1, len(my_list) - i):
# Using temp_var as my place holder so I don''t lose values
temp_var = my_list[i]
my_list[i] = my_list[j]
my_list[j] = temp_var
iteration -= 1
Puedes ir por esto:
>>> A = [''r'',''a'',''n'',''d'',''o'',''m'']
>>> B = [1,2,3,4,5,6]
>>> import random
>>> random.sample(A+B, len(A+B))
[3, ''r'', 4, ''n'', 6, 5, ''m'', 2, 1, ''a'', ''o'', ''d'']
Si desea volver a dos listas, luego divida esta larga lista en dos.
Puedes usar shuffle o sample. ambos de los cuales provienen de módulo aleatorio.
import random
def shuffle(arr1):
n=len(arr1)
b=random.sample(arr1,n)
return b
O
import random
def shuffle(arr1):
random.shuffle(arr1)
return arr1
Si tiene varias listas, es posible que desee definir la permutación (la forma en que baraja la lista / reorganizar los elementos de la lista) primero 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 arrays 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
He creado el pequeño paquete de utilidades mpu
que tiene la función consistent_shuffle
:
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 un número arbitrario de argumentos. Así que también puedes barajar tres o más listas con él.
Si ya está usando 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
Uno puede definir una función llamada shuffled
(en el mismo sentido de sort
frente a sorted
)
def shuffled(x):
import random
y = x[:]
random.shuffle(y)
return y
x = shuffled([1, 2, 3, 4])
print x
podría crear una función que tome una lista como parámetro y devuelva una versión aleatoria de la lista:
from random import *
def listshuffler(inputlist):
for i in range(len(inputlist)):
swap = randint(0,len(inputlist)-1)
temp = inputlist[swap]
inputlist[swap] = inputlist[i]
inputlist[i] = temp
return inputlist
random.shuffle
debería funcionar. 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 el orden aleatorio funciona en su lugar y devuelve Ninguno.
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,
ml = [[0], [1]] * 10
Después,
random.shuffle(ml)
El número de [0] puede ser 9 u 8, pero no exactamente 10.
""" to shuffle random, set random= True """
def shuffle(x,random=False):
shuffled = []
ma = x
if random == True:
rando = [ma[i] for i in np.random.randint(0,len(ma),len(ma))]
return rando
if random == False:
for i in range(len(ma)):
ave = len(ma)//3
if i < ave:
shuffled.append(ma[i+ave])
else:
shuffled.append(ma[i-ave])
return shuffled
#!/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]
>>> 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.
def shuffle(_list):
if not _list == []:
import random
list2 = []
while _list != []:
card = random.choice(_list)
_list.remove(card)
list2.append(card)
while list2 != []:
card1 = list2[0]
list2.remove(card1)
_list.append(card1)
return _list
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 pedido.
import random
class a:
foo = "bar"
a1 = a()
a2 = a()
a3 = a()
a4 = a()
b = [a1,a2,a3,a4]
random.shuffle(b)
print(b)
shuffle
está en su lugar, por lo que no imprima el resultado, que es None
, pero la lista.
import random
class a:
foo = "bar"
a1 = a()
a2 = a()
b = [a1.foo,a2.foo]
random.shuffle(b)