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