Python では、一連の数字をシャッフルすることは常に便利な機能であり、多くの企業の就職面接でも同様に聞かれる質問です。これを達成するための方法を複数知っていると、常にプラスになります。これを達成するための特定の方法について説明しましょう。
Python リストをランダムにシャッフルする
で パイソン、 リストをシャッフルするにはいくつかの方法があります。ここでは、Python でリストをシャッフルするさまざまな方法を紹介します。
- ソート済み()の使用
- ランダム.シャッフル()の使用
- ランダム.sample() の使用
- ランダム選択方法の使用
- フィッシャー・イェーツのシャッフル アルゴリズムの使用
- itertools.permutations() 関数の使用
- NumPy の使用
sorted() を使用してリストをランダムにシャッフルする
リストのソートされたバージョンは、次のコマンドを使用して生成できます。 ソート済み() 関数。シャッフルされたリストのコピー上で要素を使用することで、要素を効果的にランダムにシャッフルします。
Python3
import> random> my_list> => [> 1> ,> 2> ,> 3> ,> 4> ,> 5> ]> shuffled_list> => sorted> (my_list, key> => lambda> x: random.random())> print> (> 'Original list:'> , my_list)> print> (> 'Shuffled list:'> , shuffled_list)> |
>
>
出力
Original list: [1, 2, 3, 4, 5] Shuffled list: [2, 3, 4, 5, 1]>
時間計算量: O(nlogn)、n はリストの長さ
空間の複雑さ: O(n)、n はリストの長さ
Random.Shuffle() を使用してリストをランダム化する
ランダムシャッフル() リストをシャッフルする最も推奨される方法です。 Python のランダム ライブラリには、リストをインプレースでシャッフルするこの組み込み関数が用意されています。この欠点は、このプロセスでリストの順序が失われることです。時間と労力を節約したい開発者にとって役立ちます。
Python3
import> random> test_list> => [> 1> ,> 4> ,> 5> ,> 6> ,> 3> ]> print> (> 'The original list is : '> +> str> (test_list))> # using random.shuffle() to shuffle a list> random.shuffle(test_list)> print> (> 'The shuffled list is : '> +> str> (test_list))> |
>
エクタ・カプール俳優
>
出力
The original list is : [1, 4, 5, 6, 3] The shuffled list is : [5, 1, 3, 4, 6]>
時間計算量: O(n)、n はリストの長さ
空間の複雑さ: O(n)、n はリストの長さ
リストをランダム化する u Random.Sample() を歌う
ランダム.サンプル()、 これは非常に便利な関数で、元のリストの順序を乱すのではなく、新しいシャッフルされたリストを作成して返すという点で、上で使用した shuffle メソッドよりも優れています。これは、元のリストを保持する必要がある場合に役立ちます。
Python3
Javaの比較
import> random> test_list> => [> 1> ,> 4> ,> 5> ,> 6> ,> 3> ]> print> (> 'The original list is : '> +> str> (test_list))> # using random.sample()to shuffle a list> res> => random.sample(test_list,> len> (test_list))> print> (> 'The shuffled list is : '> +> str> (res))> |
>
>
出力
The original list is : [1, 4, 5, 6, 3] The shuffled list is : [4, 3, 1, 6, 5]>
時間計算量: O(n)、n はリストの長さ
空間の複雑さ: O(n)、n はリストの長さ
ランダム選択法を使用してリストをランダム化する
このメソッドでは、次を使用してリストをランダム化します。 ランダム選択方式 。インデックスをランダムに選択し、そのインデックスにある要素をリストに追加します。
Python3
import> random> arr> => [> 1> ,> 2> ,> 3> ,> 4> ,> 5> ,> 6> ]> print> (> 'Original List: '> , arr)> n> => len> (arr)> for> i> in> range> (n):> > j> => random.randint(> 0> , n> -> 1> )> > element> => arr.pop(j)> > arr.append(element)> > print> (> 'Shuffled List: '> , arr)> |
>
>
出力
Original List: [1, 2, 3, 4, 5, 6] Shuffled List: [1, 5, 2, 6, 3, 4]>
時間計算量: O(n) (n はリストの長さ)
空間の複雑さ: ○(1)
Fisher-Yates シャッフル アルゴリズムを使用したリストのランダム シャッフル
これは有名なアルゴリズムの 1 つです。 フィッシャー・イェーツのシャッフル アルゴリズム 、主に Python で一連の数値をシャッフルするために使用されます。このアルゴリズムは、より高いインデックス値を取得し、それを現在の値と交換するだけです。このプロセスはリストの最後までループで繰り返されます。
Python3
import> random> test_list> => [> 1> ,> 4> ,> 5> ,> 6> ,> 3> ]> print> (> 'The original list is : '> +> str> (test_list))> # using Fisher–Yates shuffle Algorithm to shuffle a list> for> i> in> range> (> len> (test_list)> -> 1> ,> 0> ,> -> 1> ):> > # Pick a random index from 0 to i> > j> => random.randint(> 0> , i> +> 1> )> > # Swap arr[i] with the element at random index> > test_list[i], test_list[j]> => test_list[j], test_list[i]> print> (> 'The shuffled list is : '> +> str> (test_list))> |
>
JavaScriptのコールバック地獄
>
出力
The original list is : [1, 4, 5, 6, 3]The shuffled list is : [3, 4, 5, 6, 1]>
時間計算量: O(n)、n はリストの長さ
空間の複雑さ: O(n)、n はリストの長さ
Itertools.Permutations() 関数を使用してリストをランダム化する
このメソッドは、 itertools.permutations() 関数を選択し、ランダムな関数を選択します。
Python3
import> random> import> itertools> lst> => [> 1> ,> 4> ,> 5> ,> 6> ,> 3> ]> permutations> => list> (itertools.permutations(lst))> shuffled_lst> => random.choice(permutations)> print> (> 'Shuffled list:'> , shuffled_lst)> |
>
>
出力
Shuffled list: (6, 5, 4, 1, 3)>
時間計算量: O(n!) ここで、n は、すべての可能な順列の生成によるリストの長さです。
空間の複雑さ: O(n!) は、すべての可能な順列が生成され、リストに保存されるためです。
リストをランダム化する Numpyを使用する
私たちが使用しているのは NumPy() リスト内の項目をシャッフルします。 numpy を使用してリストをランダム化するには、リストを NumPy 配列に変換してから、reduce 関数を適用する必要があります。これにより、シャッフルされたリストが返され、シャッフルされたリストが出力されます。
Python3
import> numpy as np> from> functools> import> reduce> test_list> => [> 1> ,> 4> ,> 5> ,> 6> ,> 3> ]> # Printing original list> print> (> 'The original list is : '> +> str> (test_list))> # using reduce() and numpy to shuffle a list> res> => reduce> (> lambda> acc, _: np.random.permutation(acc),> > range> (> len> (test_list)), np.array(test_list))> print> (> 'The shuffled list is : '> +> str> (res.tolist()))> |
>
>
出力
The original list is : [1, 4, 5, 6, 3] The shuffled list is : [3, 6, 1, 5, 4]>
時間計算量: reduce() 関数の時間計算量は、リストの長さに等しい反復回数によって決まります。 np.random.permutation() の時間計算量は O(n) です。ここで、n は入力配列の長さです。したがって、このコードの時間計算量は O(n^2) です。
空間の複雑さ: このコードのスペースの複雑さはリストのサイズによって異なります。このリストは、reduce() 関数で使用されるいくつかの追加変数とともにメモリに保存されます。したがって、空間複雑さは O(n) です。