2012-01-18 3 views
2

私は長さrのVigenere暗号鍵のlazily iterableコレクションを生成しようとしています。私はitertoolspermutations()メソッドを知っています。しかし、これはABCDABCEABCFなどのキーを生成しますが、AABCのようなことはありません。Python 3:すべての順列を生成するのではなく、長さrのすべての非反復組み合わせを生成しますか?

基本的には、反復しないタプルや文字列が必要です(つまり、反復キーを半分にして2つの同じ半分にすることができます)が、重複する文字を含むことがあります。良い例:AABABAAABAABではありません。

このようなキーを生成しないようなコレクションを作成するにはどうしたらいいですか?3文字以上のキーを探索するときにRAMを爆破することはありません。

+0

に感謝を固定? – Edwin

+0

多分曖昧に聞こえるかもしれませんが、私は "反復的"とはあなたがそのようなことをすることができるということを意味します。 – 2rs2ts

+0

あいまいではない、矛盾している。最初は反復的ではないと言うので(AABAABは動作しません)、キーを半分にカットして2つの半分にすることができます(AABAABは*働くでしょう)。あなたの例は前者をサポートしています。ちょうど明確化を求める。 – Edwin

答えて

4
("".join(s) for s in product(alphabet, repeat=n) if s[:n//2]!=s[n//2:]) 

EDIT: "* *二つの同一の半分を取得するために半分にキーをカットすることはできません" あなたは意味@PetrViktorin

+1

代わりに 'n'を使うことも、' len(s) 'を使うこともできます。また、整数除算には '//'演算子を使います。 –

+0

@PetrViktorin:oopsie、はい、ありがとう。 – katrielalex

+0

'TypeError: 'int'オブジェクトはiterableではありません。 – 2rs2ts

2

itertools.combinations_with_replacement()のように聞こえます。さらに、不要なものを除外するジェネレータを作成することもできます。

http://docs.python.org/library/itertools.html#itertools.combinations_with_replacement

+0

+1。私はitertoolsを頻繁に使いますが、とてもいいです。 @agarettが望んでいるものとまったく同じように見えます。 – ChristopheD

+1

残念ながら、 'combination'はソートされているので正しくありません。 – katrielalex

+0

私はそれがどのようにすべての組み合わせを作成するのか見ていますが、そのようなジェネレータを書く方法はわかりません。キーを反復しながら、前半が後半と等しいかどうかを確認することができますが、それが魔法のように避けられれば私はそれを好むでしょう。 – 2rs2ts

関連する問題