Comme vous l'avez appris, c'est le brassage sur place qui pose problème. J'ai aussi souvent ce problème, et je semble souvent oublier comment copier une liste, aussi. En utilisant sample(a, len(a))
est la solution, en utilisant len(a)
comme la taille de l'é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 retourne le résultat mélangé comme une nouvelle liste.
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
7 votes
Pouvez-vous donner un exemple d'échec ? random.shuffle devrait fonctionner de manière invariante par rapport au type des objets de la liste.
4 votes
>>> a1 = a() >>> a2 = a() >>> b = [a1,a2] >>> b [<__main__.a instance at 0xb7df9e6c>, <__main__.a instance at 0xb7df9e2c>] >>> print random.shuffle(b) None
154 votes
Comme indiqué ci-dessous, random.shuffle ne renvoie pas une nouvelle liste mélangée ; il mélange la liste en place. Vous ne devriez donc pas dire "print random.shuffle(b)" mais plutôt effectuer le mélange sur une ligne et imprimer b sur la ligne suivante.
0 votes
Si vous essayez de mélanger des tableaux numpy, voyez ma réponse ci-dessous.
3 votes
Existe-t-il une option qui ne modifie pas le tableau original mais renvoie un nouveau tableau mélangé ?
0 votes
@Charlie : Non, il n'y a pas
shuffle()
options pour cela. Utilisez simplementrandom.sample(b, len(b))
à la place.0 votes
print random.shuffle(b)
vous pouvez obtenir None justeprint b
après le shuffle0 votes
Pourquoi avez-vous essayé d'imprimer la sortie de
shuffle
? Il devrait êtreNone
pendant qu'il remet le tableau en place.