2015-11-08 11 views
5

私はitertoolsを使用しています。productspermutationsおよびcombinationsを生成できます。python itertoolsを使用してカスタム反復を生成

max_allowed_len(sequence)= 3 
iterable= ABC 
repeat= 3 (or just `range(len('ABC')`) 

私は繰り返しrを持つことによってlen(sequence)=0 len(sequence)=1 OR len(sequence)=2 and len(sequence)=3とABCのすべての異なる反復可能なセットを生成するに興味を持っています:ただし、などのケースを考慮。異なるシーケンスを可能にする反復を伴う奇妙な順列のそのようなもの。だから私のスペースは: 3^0 + 3^1 + 3^2 + 3^3= 1 + 3 + 9+ 27= 40 誰も私はどのようにPythonでそれを実装する方法を提案することができますかC/C + +?

例えば:予想される出力:

` '0'(何も(シーケンス長0))

配列長= 1

'A' 
'B' 
'C' 

と配列長= 2

'AA' 
'BB' 
'CC' 
'AB' 
'AC',... 

長さ= 3のシーケンス

'AAB' 
'ABA' 
'AAC' 
'ACA'` 

これが続きます。だからここで私は0,1,2,3の長さを持っていた。

+0

期待される出力の例を挙げることができますか? – thefourtheye

+0

質問を修正するにはちょっと分、 – Amir

+0

結果にどのようにして '0'を得ましたか? – thefourtheye

答えて

5

これは、文字列入力用のイテレータを作成する(比較的)簡単な方法です。 nullシーケンスに対して空の文字列''を出力します。出力を読みやすくするために2回呼びます。

関数のコアは、productrepeat argを使用するジェネレータ式ループで、長さがゼロから入力文字列の長さまでの各グループのイテレータを生成します。これらのイテレータはchain.from_iterableによって消費され、を使用して''.joinメソッドに供給され、実際にproductによって生成された各タプルのメソッドを呼び出します。

from itertools import product, chain, imap 

def all_prod(s): 
    return imap(''.join, chain.from_iterable(product(s, repeat=i) for i in range(len(s)+1))) 

print(list(all_prod('ABC'))) 

for s in all_prod('abc'): 
    print(s) 

出力

['', 'A', 'B', 'C', 'AA', 'AB', 'AC', 'BA', 'BB', 'BC', 'CA', 'CB', 'CC', 'AAA', 'AAB', 'AAC', 'ABA', 'ABB', 'ABC', 'ACA', 'ACB', 'ACC', 'BAA', 'BAB', 'BAC', 'BBA', 'BBB', 'BBC', 'BCA', 'BCB', 'BCC', 'CAA', 'CAB', 'CAC', 'CBA', 'CBB', 'CBC', 'CCA', 'CCB', 'CCC'] 

a 
b 
c 
aa 
ab 
ac 
ba 
bb 
bc 
ca 
cb 
cc 
aaa 
aab 
aac 
aba 
abb 
abc 
aca 
acb 
acc 
baa 
bab 
bac 
bba 
bbb 
bbc 
bca 
bcb 
bcc 
caa 
cab 
cac 
cba 
cbb 
cbc 
cca 
ccb 
ccc 

FWIW、ここで普通chain関数を使用する代替バージョンです。それはimapの代わりに余分なループを使用しているので、それはあまり効率的ではないかもしれませんが、理解するのが少し簡単かもしれません。

def all_prod(s): 
    return (''.join(v) for u in chain(product(s, repeat=i) for i in range(len(s)+1)) for v in u) 
+0

素敵で素敵な!基本的に繰り返しの追加ループを持つ再帰的な製品ですか? – Amir

+1

@Amir:再帰的ではありません - 'product'呼び出しは繰り返しループしています。私は 'itertools' _might_内部でいくつかの関数を使って再帰を使用していると思いますが、反復アルゴリズムは通常は高速でRAMの効率が良いので、そうではないと思われます。 –

+0

はい。そのとおり。 awsome – Amir

関連する問題