Python 3: генерировать не все перестановки, но все неповторяющиеся комбинации длины r? - PullRequest
2 голосов
/ 18 января 2012

Я пытаюсь создать лениво повторяемую коллекцию ключей шифрования Vigenere длины r.Я знаю о itertools и методе permutations().Тем не менее, это генерирует ключи, такие как ABCD, ABCE, ABCF ... но это никогда не будет делать что-то вроде AABC.

Так что в основном мне нужны кортежи или строки символов,повторяющийся (то есть повторяющийся ключ можно разрезать пополам, чтобы получить две одинаковые половины), но он может содержать повторяющиеся символы.Хороший пример: AABABA, а не AABAAB.

Как я могу создать такую ​​коллекцию, которая не будет генерировать ключи, подобные этой, и лениво повторяется, поэтому я не взрываю свою оперативную память, когда хочуисследовать ключи длиннее 3 символов?

Ответы [ 2 ]

4 голосов
/ 18 января 2012
("".join(s) for s in product(alphabet, repeat=n) if s[:n//2]!=s[n//2:])

РЕДАКТИРОВАТЬ: исправлено благодаря @ PetrViktorin

2 голосов
/ 18 января 2012

Звучит так, как будто вы хотите использовать itertools.combinations_with_replacement().Кроме того, вы можете написать генератор вокруг него, чтобы отфильтровать ненужные.

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

...