Генерация всех уникальных парных перестановок

Мне нужно сгенерировать все возможные пары, но с ограничением, что конкретное соединение встречается только один раз в результатах. Так, например:

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, который мог бы решить эту проблему, но я не достаточно опытен, чтобы знать, что это такое.

Обновить: Гарет Рис прав: я совершенно не знал, что пытаюсь решить проблему с круговым циклом. У меня есть дополнительное ограничение, которое заключается в том, что я делаю группирование людей для упражнений по парному программированию. Таким образом, если у меня нечетное количество людей, мне нужно создать группу из трех человек, включающую нечетного человека для каждого упражнения. Мое текущее мышление состоит в том, чтобы (1) создать четное число людей, добавив невидимого человека. Затем, после объединения, найдите человека в паре с человеком-невидимкой и случайным образом поместите его в существующую группу, чтобы сформировать команду из трех человек. Тем не менее, мне интересно, если нет уже алгоритма или настройки для циклического перебора, который делает это лучше.

Обновление 2Решение Теодроса дает абсолютно правильный результат, без лишних размышлений, о которых я описал выше. Все были удивительно полезны.

Ответы на вопрос(3)

Ваш ответ на вопрос