web-dev-qa-db-fra.com

Pourquoi random.shuffle ne renvoie-t-il aucun?

Pourquoi random.shuffle renvoie-t-il None en python?

>>> x = ['foo','bar','black','sheep']
>>> from random import shuffle
>>> print shuffle(x)
None

Comment puis-je obtenir la valeur mélangée au lieu de None?

57
alvas

random.shuffle() modifie la x liste in place.

Les méthodes de l'API Python qui modifient une structure sur place renvoient généralement None, pas la structure de données modifiée.

Si vous voulez créer une liste new modifiée de manière aléatoire à partir d'une liste existante, dans laquelle la liste existante est conservée dans l'ordre, vous pouvez utiliser random.sample() avec toute la longueur de l'entrée:

x = ['foo', 'bar', 'black', 'sheep']
random.sample(x, len(x))     

Vous pouvez également utiliser sorted() avec random.random() pour une clé de tri:

shuffled = sorted(x, key=lambda k: random.random())

mais cela appelle le tri (une opération O(NlogN)), tandis que l'échantillonnage de la longueur en entrée prend uniquement des opérations O(N) (le même processus que random.shuffle() est utilisé, en remplaçant les valeurs aléatoires par une réduction). bassin).

Démo:

>>> 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']
98
Martijn Pieters

Cette méthode fonctionne aussi.

import random
shuffled = random.sample(original, len(original))
26
Acemad

Selon docs :

Mélangez la séquence x en place. L'argument optionnel aléatoire est un Fonction à 0 argument renvoyant un nombre aléatoire dans [0.0, 1.0); par Par défaut, c'est la fonction random ().

>>> x = ['foo','bar','black','sheep']
>>> from random import shuffle
>>> shuffle(x)
>>> x
['bar', 'black', 'sheep', 'foo']
8
alecxe

shuffle modifie la liste en place ..__ C'est bien agréable, car copier une liste volumineuse ne serait que superflu si vous n'avez plus besoin de la liste originale.

Selon le "explicite vaut mieux qu'implicite" principe de Style Pythonic , renvoyer la liste serait une mauvaise idée, car on pourrait penser que est un nouveau bien que ce soit en fait n'est pas.

Si vous avez besoin d'une nouvelle liste, vous devrez écrire quelque chose comme

new_x = list(x)  # make a copy
random.shuffle(new_x)

qui est bien explicite . Si vous avez souvent besoin de cet idiome, enveloppez-le dans une fonction shuffled (voir sorted) qui retourne new_x.

5
Lutz Prechelt
shuffle(x)

ne renvoie aucune valeur. Au lieu de cela, cette fonction mélange la variable elle-même.

Alors n'essayez pas

print shuffle(x)

à la place, imprimez simplement la variable comme celle-ci.

>>> x = ['foo','bar','black','sheep']
>>> from random import shuffle
>>> x
['bar', 'black', 'foo', 'sheep']
1
Gangil Seo

J'ai eu mon moment aha avec ce concept comme ceci:

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']
1
litepresence

Les API Python qui changent la structure en place retournent elles-mêmes None en sortie.

list = [1,2,3,4,5,6,7,8]
print(list)

Sortie: [1, 2, 3, 4, 5, 6, 7, 8]

from random import shuffle
print(shuffle(list))

Sortie: Aucune

from random import sample
print(sample(list, len(list)))

Sortie: [7, 3, 2, 4, 5, 6, 1, 8]

1
user3467537
>> x = ['foo','bar','black','sheep']
>> random.shuffle(x)
>> print(x)
>> ['sheep', 'bar', 'foo', 'black']

Comme indiqué, random.shuffle remplace en place, vous n'avez donc pas besoin d'une nouvelle variable de liste.

1
frank stockmans

Vous pouvez retourner la liste mélangée en utilisant random.sample() comme expliqué par d'autres. Cela fonctionne en échantillonnant k éléments de la liste sans remplacement . Ainsi, s'il existe des éléments en double dans votre liste, ils seront traités de manière unique.

>>> 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]
0
devsaw