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

2 投票
2 回答
544 浏览
提问于 2025-04-17 10:29

我想生成一个可以懒惰迭代的维吉尼亚密码钥匙集合,长度为r。我知道有一个叫做itertools的工具,还有permutations()这个方法。不过,这个方法生成的钥匙像ABCDABCEABCF这样的,但它永远不会生成像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 的帮助,已经修正了。

撰写回答