次の簡単なコードは、長さ3の200要素の可能な組み合わせを示しています。iterable(itertools.combinations)をリストに変換せずにシャッフルする組み合わせ
from itertools import combinations
comb = combinations(range(200), 3)
最初のN個の組み合わせを選択するために、ランダムな順序で組み合わせを取得したいと考えています。
comb = list(comb) # This might be huge and give a memory error
random.shuffle(comb)
N = 10
comb = comb[:10] # get only the first N random combinations
Nランダムな組み合わせを得るために他の方法があります:私はリストに櫛を変換すると、次のようにそれをシャッフルする場合は、リストがあまりにも多くの要素が含まれている可能性があるのでしかし、私は、メモリエラーを得ることができますか? (つまり、itertools.combinationsによって生成された順序ではありません)。
この答えはイテレータ – mprat
の特性を利用しません。以下の関数では、 'pool = tuple(iterable)'を代入しています。 'random_combination(comb、10)'で関数を呼び出すと、すべての可能な組み合わせが生成され、poolという変数に格納されます。これはOPが避けようとしていたものです。 – ayhan
@mprat:これは基本的にストリーム操作ではありません。イテレータには利点がありません。あなたの答えは、itertoolsドキュメンテーションから取られていても、itertoolsまたはiteratorオペレーションを全く使用しません。 'itertools.combinations'に関連した作業だからです。 – user2357112