2017-05-19 9 views
-1

pythonで1,2,3という3つの要素を使って81タプルのリストを作りたいと思います。巨大なデータを持つitertoolsプロダクトの使い方

私は解決策を見つけることを試み、その後、私はこれらの便利なリンクが見つかりました:上記のリンクによると

How to use itertools to compute all combinations with repeating elements?

Which itertools generator doesn't skip any combinations?

を、私は次のよう

を行う必要があります
import itertools 

list = [] 
for p in itertools.product(range(1, 3 + 1), repeat=81): 
    list.append(p) 

print(list) 

しかし、私のコンピュータがハングします。私はリストにあまりにも多くのデータがあると思う。

リストに最初の100要素だけを印刷するか、リストの101番目から200番目までを印刷するコマンドがあるかどうかを知りたいと思います。

+0

443426488243037769948249630619149892803のリストを作成しようとしています。 RAMを使い果たしている可能性があります:) –

答えて

3

あなたはitertools.isliceを使用することができます。それは、スライスの開始インデックスに達するまで

p = itertools.product(range(1, 3 + 1), repeat=81) 
s = itertools.islice(p, 101, 200) 
print(list(s)) 

この意志、しかし、すべての要素を反復処理します。だから、漠然とした要素(あなたは3**81 = 443426488243037769948249630619149892803を持っていますか、言い換えれば、あまりにも多くを処理するには多すぎます)を持つイテレータの終わりに向かって、これは同様の問題に遭遇します。

これらの後の範囲では、n番目の要素を手で計算し、そこから後継者を生成する必要があります... How to select specific item from cartesian product without calculating every other itemを参照してください。

+0

これを使用した後、が表示されます。 – OpiRabbit

+0

これは怠惰なイテレータの要点です。要素を見るには、部分的に反復したり、リストに変換したりする必要があります。したがって、最初にスライスし(いくつかの反復を含む)、それをリストに変換してから印刷します(コード例のように)。 – schwobaseggl

関連する問題