2017-12-15 3 views
1

itertoolsを使って効率的にやりますか?そのリストの長さは557845どのように配列の要素を持つすべての組み合わせを生成し、代わりにitertoolsを使って書式設定された文字列を入れることができますか?

#Generate all combinations of 4 elements and put on list  
listLol=list(map("".join, itertools.combinations('1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',4))) 
#This is too slow 
    for a in listLol: 
     for b in listLol: 
      for c in listLol: 
       for d in listLol: 
        for e in listLol: 
         cadena="SomeString-"+a+"-"+b+"-"+c+"-"+d+"-"+e 
+7

ええと... 50万要素のリストに5つのネストループを実行したいのですが、何をしようとしていますか? –

+1

ネストされたループは基本的に 'listLol'の組み合わせを作成していませんか?重複して、確かに。しかし、あなたはそれをエミュレートすることができます。あなたの実際の目標が何であるかについてもう少し説明できますか? – mypetlion

+0

私は暗号化された文字列を持っていて、非暗号化文字列の構造だけを知っています。暗号化する文字列を取得して比較する必要があります。それは私が考えているクラッシュハッシュのようなものです... – user3626760

答えて

0

itertools.productで実際に行うことができます。

IllAdvised = ["SomeString-" + "-".join(i) for i in itertools.product(listLol, repeat=5)] 

また、あなたの元のリストを生成するためのitertools.combinations_with_replacementではなく、単にitertools.combinationsを検討する必要があります。 EDIT:itertools.product元のリストにも同じように表示されます。この場合、itertools.product(alphabetALPHABET, repeat=20)を使用してまっすぐに進むことができます。 (もちろん、alphabetALPHABETは元の文字列です)。

ただし、どのように行っても非常に長い時間がかかります。あなたのリストには557845^5個の要素があります。combinations_with_replacementまたはitertools.productを使用すると7311616^5があります。この新しいリストでは、それは10^28以上の要素です。あなたは発電機とメモリの問題を回避している場合でも:このループの

for i in itertools.product(listLol, repeat=5): 
    cadena="SomeString-" + "-".join(i) 
    #do something with cadena 

ランタイムは、宇宙の現在の年齢を超えてしまいます。この障壁は、あなたがどのように言語を知っていても、あるいはあなたが適用する小さな最適化が何であれ、難しくありません。別のアプローチを試してみることをお勧めします。

+0

@StefanPochmann良いキャッチ - 代わりにitertools.productを使用する答えを編集します。 – colopop

+0

@StefanPochmannデフォルトの引数に名前を付けるだけです。一定。ちなみに、SOは左下に「編集」ボタンを備えているので、次に20文字で修正できる問題が表示されたら、70文字の苦情を残す代わりに自分で追加することができます:) – colopop

関連する問題