Python 3:生成的不是所有排列,而是生成长度r的所有非重复组合?

时间:2012-01-18 00:20:06

标签: python cryptography iteration lazy-evaluation vigenere

我正在尝试生成一个长度为r的Vigenere密码密钥的可迭代迭代集合。我知道itertoolspermutations()方法。但是,这会生成ABCDABCEABCF等密钥...但它永远不会执行AABC之类的操作。

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

我怎样才能创建这样一个不会生成这样的密钥的集合,而且是懒得迭代的,所以当我想探索长度超过3个字符的密钥时,我不会炸掉我的RAM?

2 个答案:

答案 0 :(得分:4)

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

编辑:感谢@PetrViktorin

答案 1 :(得分:2)

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

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