我需要生成所有可能的配對,但是約束條件是僅在結果中出現一次特定的配對。因此,例如:生成所有唯一的對排列
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里斯是正確的 - 我完全沒有意識到,我試圖解決循環問題。我還有一個額外的限制,那就是我正在做的是將人們分組編程練習。因此,如果我有一個奇數的人,我需要創建一個三人組,每個練習包括一個奇怪的人。我目前的想法是(1)通過添加一個無形的人來製造偶數的人。然後,在配對之後,找到與無形人配對的人,並隨機將他們放入現有組中,組成一個三人小組。但是,我想知道是否還沒有一種算法或者對循環法的調整能夠以更好的方式做到這一點。
更新2:Theodros的解決方案產生完全正確的結果,沒有我上面描述的不雅行爲。每個人都非常有幫助。
你的配對究竟是什麼意思?通過置換? (0,1),(2,3),(4,5),(6,7)]通常不會被稱爲置換或[0,1,2,3,...,8 ]。 –
我已更新我的答案以解決您的更新問題。 –