我对SilentGhost的提案进行了出色的跟进-发布单独的答案,因为注释的边距太窄而无法包含代码:-)
itertools.permutations内置(自2.6版开始)且速度很快。我们只需要一个过滤条件,对于每个条件(perm,perm
[::-1])都将接受其中的一个。由于OP表示项目始终是不同的,因此我们可以比较任意两个元素:
for p in itertools.permutations(range(3)): if p[0] < p[-1]: print p
打印:
(0, 1, 2)(0, 2, 1)(1, 0, 2)
之所以有效,是因为反转排列总是会翻转关系!
p[0] < p[1]或任何其他对也可以,因此您还可以控制获得的排列的一半。
我不确定是否还有其他更有效的过滤方法。
itertools.permutations保证书目顺序,但是书目位置
p和
p[::-1]以非常复杂的方式相关。特别是,仅在中间停下来是行不通的。
但是我怀疑(没有检查)带有2:1过滤的内置迭代器是否会胜过任何自定义实现。当然,它以简单性取胜!



