Pythonでリストから重複なしの抽出

Pythonに限らず何らかのデータから重複なしでデータをランダムに取りたいということがままあると思う。簡単に思いつくのは、ランダムに一つとって削除、ランダムに一つとって削除を繰り返す方法だが、Pythonの場合ちゃんと関数が用意されている。

良くこの処理をどう実装するか悩んでいたので忘れないようにめも。

Pythonで提供されているrandomモジュールのsampleメソッドを使う。

 random.sample(population, k)
  • population:抽出するリスト

  • k:抽出する数。但し、len(population)>=kである必要がある。

import random
index = random.sample(xrange(100), 50)#抽出する添字を取得
samples = [samples[i] for i in index]#sampleをとる

補足

xrangeを使っているのは、整数のリストからの抽出において、リストの長さが非常に長い場合(referenceの例だと1000万ほど)にメモリ効率と速度が向上する為である。

この場合速度に貢献してるかは検証してない。

参考

リストから任意の数の要素をランダムに且つ重複なしで抽出したい - Study03.net 対シンバシ専用