我正在尝试生成一个长度为r的Vigenere密码密钥的可迭代迭代集合。我知道itertools
和permutations()
方法。但是,这会生成ABCD
,ABCE
,ABCF
等密钥...但它永远不会执行AABC
之类的操作。
基本上,我需要元组或不重复的字符串(也就是说,重复的键可以减半以获得两个相同的一半),但可以包含重复的字符。好例子:AABABA
,而不是AABAAB
。
我怎样才能创建这样一个不会生成这样的密钥的集合,而且是懒得迭代的,所以当我想探索长度超过3个字符的密钥时,我不会炸掉我的RAM?
答案 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