Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonでKサイズのリストをN個ランダムに生成する方法

サイズKのリストをN個、ランダムに生成したい場面は意外と多くあります。本記事では、randomモジュールのshuffle関数とジェネレータを組み合わせて、元のリストの要素をシャッフルしながら先頭K個を取り出す方法を解説します。

サンプルコード

以下に実際の実装例を示します。

from random import shuffle

def gen_random_list(my_val, K):
   while True:
      shuffle(my_val)
      yield my_val[:K]

my_list = [12, 45, 76, 32, 45, 88, 99, 0, 1]
print("The list is ")
print(my_list)

K, N = 4, 5
print("The value of K is ")
print(K)
print("The value of N is ")
print(N)

my_result = []
for elem in range(0, N):
   my_result.append(next(gen_random_list(my_list, K)))

print("The result is " )
print(my_result)

実行結果

The list is
[12, 45, 76, 32, 45, 88, 99, 0, 1]
The value of K is
4
The value of N is
5
The result is
[[88, 76, 99, 12], [12, 99, 32, 76], [32, 76, 12, 99], [32, 45, 0, 12], [76, 0, 1, 45]]

コードの解説

  • まず、必要なパッケージとしてrandomモジュールからshuffle関数をインポートします。

  • 次に、値のリストとサイズ「K」を引数に取るメソッドgen_random_listを定義します。

  • このメソッド内では、shuffle関数でリストの順序をランダムに入れ替え、スライス構文my_val[:K]によって先頭からK個の要素を取り出し、yieldを使ってジェネレータとして結果を返します。

  • メソッドの外側では、元となるリストを定義し、コンソールに表示します。

  • KとNの値を設定し、それぞれコンソールに出力します。

  • 結果を格納するための空のリストを用意します。

  • 0からNまでの範囲をループ処理し、そのたびにnext()でジェネレータから新しいランダムなリストを取得して、空のリストに追加していきます。

  • 最終的に、生成されたN個のリストをコンソールに出力します。

ポイントまとめ

  • shuffleは元のリストを直接書き換える(破壊的変更)ため、元の順序を保持したい場合は事前にコピーを作成しておくと安全です。

  • ジェネレータ関数を使用することで、必要な回数だけ都度ランダムな組み合わせを遅延評価で取得でき、メモリ効率にも優れています。

  • 重複する要素を含むリストの場合、同じ組み合わせが生成される可能性もあります。完全に一意な組み合わせが必要な場合は、itertools.permutationsなどとの併用も検討しましょう。

  1. Pythonで2つのリストから辞書(dict)を作成する方法を解説

    Pythonで2つのリストから辞書を作成する基本の方法Pythonでは、キーのリスト(L1)と値のリスト(L2)がそれぞれ別のリストオブジェクトとして用意されている場合、辞書内包表記を使うことで、簡潔に辞書オブジェクトを構築できます。以下のように、リストのインデックス番号をキーとして、対応する要素同士を組み合わせるのが基本的な考え方です。辞書内包表記を使用した例>>> L1 = [a,b,c,d] >>> L2 = [1,2,3,4] >>> d = {L1[k]:L2[k] for k in range(len(L1))} >>

  2. Pythonで指定したサイズのファイルを作成する方法

    Pythonで特定のサイズのファイルを作成するのはとても簡単です。基本的な考え方は、作成したいファイルサイズ(バイト数)の位置までシーク(seek)し、そこに1バイトだけ書き込むというものです。 スパースファイルを作成する例 with open(my_file, wb) as f: f.seek(1024 * 1024 * 1024) # 1GB の位置へ移動 f.write(b0) このコードを実行すると、見かけ上は1GBのファイルが作成されます。しかし、実際にはディスク容量をほとんど消費しません。これはスパースファイル(疎なファイル)と呼ばれるもので、ファイルシステムが実