2

我正在尝试生成长度为 r 的 Vigenere 密码密钥的可延迟迭代集合。我知道itertoolspermutations()方法。但是,这会生成诸如ABCD, ABCE, ABCF... 之类的键,但它永远不会执行诸如AABC.

所以基本上,我需要不重复的元组或字符串(也就是说,可以将重复的键切成两半以获得相同的两半),但可以包含重复的字符。好例子:AABABA,不是AABAAB

我怎样才能创建这样一个集合,它不会生成这样的密钥,并且是延迟迭代的,所以当我想探索超过 3 个字符的密钥时,我不会炸毁我的 RAM?

4

2 回答 2

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

编辑:感谢@PetrViktorin 修复

于 2012-01-18T00:29:36.093 回答
2

听起来你想使用itertools.combinations_with_replacement(). 最重要的是,您可以围绕它编写一个生成器来过滤掉您不想要的那些。

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

于 2012-01-18T00:25:36.043 回答