Python 3:生成长度为 r 的所有不重复组合而非全排列?
我想生成一个可以懒惰迭代的维吉尼亚密码钥匙集合,长度为r。我知道有一个叫做itertools
的工具,还有permutations()
这个方法。不过,这个方法生成的钥匙像ABCD
、ABCE
、ABCF
这样的,但它永远不会生成像AABC
这样的钥匙。
简单来说,我需要的是一些字符组合,它们不能重复(也就是说,如果一个钥匙是重复的,就可以把它一分为二,得到两个完全相同的部分),但可以包含重复的字符。好的例子是AABABA
,而不是AABAAB
。
我该如何创建这样一个集合,既不会生成像这样的钥匙,又能懒惰迭代,这样当我想探索超过3个字符的钥匙时,就不会占用太多内存?
2 个回答
2
听起来你想用 itertools.combinations_with_replacement()
这个功能。除此之外,你还可以在它的基础上写一个生成器,来过滤掉你不想要的结果。
http://docs.python.org/library/itertools.html#itertools.combinations_with_replacement
4
("".join(s) for s in product(alphabet, repeat=n) if s[:n//2]!=s[n//2:])
编辑:感谢 @PetrViktorin 的帮助,已经修正了。