我需要生成所有可能的配对,但限制是特定配对只在结果中出现一次。例如:
import itertools
for perm in itertools.permutations(range(9)):
print zip(perm[::2], perm[1::2])
生成所有可能的两对排列;这是输出的一小部分:
...
[(8, 4), (7, 6), (5, 3), (0, 2)]
[(8, 4), (7, 6), (5, 3), (1, 0)]
[(8, 4), (7, 6), (5, 3), (1, 2)]
[(8, 4), (7, 6), (5, 3), (2, 0)]
[(8, 4), (7, 6), (5, 3), (2, 1)]
[(8, 5), (0, 1), (2, 3), (4, 6)]
[(8, 5), (0, 1), (2, 3), (4, 7)]
[(8, 5), (0, 1), (2, 3), (6, 4)]
[(8, 5), (0, 1), (2, 3), (6, 7)]
[(8, 5), (0, 1), (2, 3), (7, 4)]
[(8, 5), (0, 1), (2, 3), (7, 6)]
[(8, 5), (0, 1), (2, 4), (3, 6)]
[(8, 5), (0, 1), (2, 4), (3, 7)]
[(8, 5), (0, 1), (2, 4), (6, 3)]
...
我如何进一步过滤它,以便我只看到一次(8,4)(在所有过滤的排列中),和(8,5)只看到一次,(0,1)只看到一次,和(4,7 ) 只有一次,等等?
基本上我想要这样的排列,使得每个两元素配对只发生一次。
我敢打赌,还有一个额外的 itertool 可以解决这个问题,但我不够专业,不知道它是什么。
更新:Gareth Rees 是正确的——我完全没有意识到我正在尝试解决循环问题。我还有一个额外的限制,那就是我正在做的是将人们分组以进行结对编程练习。因此,如果我的人数是奇数,我需要创建一个三人小组,以在每个练习中包括一个奇数人。我目前的想法是(1)通过添加一个隐形人来使人数为偶数。然后,配对后,找到与隐形人配对的人,并将他们随机放入现有的组中,形成一个三人团队。但是,我想知道是否还没有一种算法或对循环的调整可以更好地做到这一点。
更新 2:Theodros 的解决方案产生了完全正确的结果,而没有我上面描述的不雅点。每个人都非常乐于助人。