1. ホーム
  2. python

[解決済み] random.shuffleはなぜNoneを返すのですか?

2022-08-11 05:07:11

質問

なぜ random.shuffle を返すのか None をPythonで返すか?

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

の代わりにシャッフルされた値を取得するにはどうすればよいでしょうか? None ?

どのように解決するのですか?

random.shuffle() x リスト に変更します。 .

Python API のメソッドで、構造体をインプレースで変更するものは、一般的に None を返し、変更されたデータ構造ではありません。

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


を作りたかったら 新しい を作りたい場合、既存のリストの順番を維持したまま、ランダムにシャッフルされたリストを作るには random.sample() を入力の全長で指定します。

random.sample(x, len(x))     

また sorted() random.random() をソートキーとする。

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

と同じ処理ですが、これはソート(O(N log N)演算)を必要とし、入力の長さに応じたサンプリングはO(N)演算で済みます(これは random.shuffle() と同じ処理が使われ、縮小するプールからランダムな値をスワップします)。

デモです。

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