J'ai une liste d'objets et je veux les mélanger. Je pensais pouvoir utiliser la random.shuffle
méthode, mais cela semble échouer lorsque la liste est constituée d'objets. Existe-t-il une méthode pour mélanger les objets ou une autre solution?
import random
class A:
foo = "bar"
a1 = a()
a2 = a()
b = [a1, a2]
print(random.shuffle(b))
Cela échouera.
Réponses:
random.shuffle
devrait marcher. Voici un exemple, où les objets sont des listes:Notez que la lecture aléatoire fonctionne en place et renvoie Aucun.
la source
random
documentation du module .random.sample(x, len(x))
ou simplement faire une copie etshuffle
cela. Pourlist.sort
qui a un problème similaire, il y en a maintenantlist.sorted
, mais il n'y a pas de variante similaire pourshuffle
.from random import SystemRandom
place; ajoutezcryptorand = SystemRandom()
et changez la ligne 3 encryptorand.shuffle(x)
Comme vous l'avez appris, le brassage sur place était le problème. J'ai aussi souvent des problèmes et j'ai souvent l'impression d'oublier comment copier une liste. Utiliser
sample(a, len(a))
est la solution, utiliserlen(a)
comme taille d'échantillon. Voir https://docs.python.org/3.6/library/random.html#random.sample pour la documentation Python.Voici une version simple utilisant
random.sample()
qui renvoie le résultat mélangé dans une nouvelle liste.la source
old = [1,2,3,4,5]; new = list(old); random.shuffle(new); print(old); print(new)
(remplacer; avec des nouvelles lignes)old[:]
pourrait également faire une copie peu profonde pour la listeold
.sample()
est particulièrement utile pour le prototypage d'une analyse de données.sample(data, 2)
pour configurer le code de colle d'un pipeline, puis "l'élargir" par étapes, jusqu'àlen(data)
.Il m'a fallu un certain temps pour l'obtenir aussi. Mais la documentation de shuffle est très claire:
Vous ne devriez donc pas
print(random.shuffle(b))
. Faites plutôtrandom.shuffle(b)
et ensuiteprint(b)
.la source
la source
Si vous utilisez déjà numpy (très populaire pour les applications scientifiques et financières), vous pouvez vous enregistrer une importation.
http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.shuffle.html
la source
Ça fonctionne bien pour moi. Assurez-vous de définir la méthode aléatoire.
la source
Si vous avez plusieurs listes, vous souhaiterez peut-être d'abord définir la permutation (la façon dont vous mélangez la liste / réorganisez les éléments de la liste), puis l'appliquez à toutes les listes:
Numpy / Scipy
Si vos listes sont des tableaux numpy, c'est plus simple:
mpu
J'ai créé le petit paquet utilitaire
mpu
qui a laconsistent_shuffle
fonction:Notez que cela
mpu.consistent_shuffle
prend un nombre arbitraire d'arguments. Vous pouvez donc également mélanger trois listes ou plus avec.la source
Cette alternative peut être utile pour certaines applications où vous souhaitez échanger la fonction de commande.
la source
sorted
, c'est un remaniement fonctionnel (si vous êtes dans ce genre de chose).Dans certains cas, lors de l'utilisation de tableaux numpy, à l'aide de
random.shuffle
données en double créées dans le tableau.Une alternative est d'utiliser
numpy.random.shuffle
. Si vous travaillez déjà avec numpy, c'est la méthode préférée par rapport au génériquerandom.shuffle
.numpy.random.shuffle
Exemple
En utilisant
random.shuffle
:En utilisant
numpy.random.shuffle
:la source
numpy.random.permutation
peuvent intéresser: stackoverflow.com/questions/15474159/shuffle-vs-permute-numpyrandom.shuffle
la documentation doit crier Ne pas utiliser avec les tableauxPour les monolignes, utilisez
random.sample(list_to_be_shuffled, length_of_the_list)
avec un exemple:sorties: [2, 9, 7, 8, 3, 0, 4, 1, 6, 5]
la source
'print func (foo)' affichera la valeur de retour de 'func' lorsqu'il est appelé avec 'foo'. 'shuffle' a cependant None comme type de retour, car la liste sera modifiée sur place, donc elle n'imprime rien. Solution de contournement:
Si vous êtes plus dans le style de programmation fonctionnel, vous voudrez peut-être faire la fonction wrapper suivante:
la source
random.sample(ls, len(ls))
si vous voulez vraiment emprunter cette voie.On peut définir une fonction appelée
shuffled
(dans le même sens desort
vssorted
)la source
shuffle
est en place, donc n'imprimez pas le résultat, ce qui est le casNone
, mais la liste.la source
Vous pouvez y aller:
si vous souhaitez revenir à deux listes, vous divisez ensuite cette longue liste en deux.
la source
vous pouvez créer une fonction qui prend une liste en paramètre et renvoie une version mélangée de la liste:
la source
la source
vous pouvez soit utiliser shuffle ou sample. les deux proviennent d'un module aléatoire.
OU
la source
Assurez-vous que vous ne nommez pas votre fichier source random.py et qu'il n'y a pas de fichier dans votre répertoire de travail appelé random.pyc. .
la source
la source
_list.extend(list2)
, qui est plus succincte et plus efficace.la source
Le processus de mélange est "avec remplacement" , donc l'occurrence de chaque élément peut changer! Au moins lorsque les éléments de votre liste sont également listés.
Par exemple,
Après,
Le nombre de [0] peut être 9 ou 8, mais pas exactement 10.
la source
Plan: Écrivez le mélange sans compter sur une bibliothèque pour faire le gros du travail. Exemple: Parcourez la liste depuis le début en commençant par l'élément 0; trouver une nouvelle position aléatoire pour lui, disons 6, mettre la valeur 0 dans 6 et la valeur 6 dans 0. Passez à l'élément 1 et répétez ce processus, et ainsi de suite dans le reste de la liste
la source
my_list[i], my_list[j] = my_list[j], my_list[i]
Ça fonctionne bien. Je l'essaye ici avec des fonctions comme objets de liste:
Il affiche: foo1 foo2 foo3 foo2 foo3 foo1 (les foos de la dernière ligne ont un ordre aléatoire)
la source