У меня есть список идентификаторов, представляющих пользователей, и я пишу функцию, чтобы превратить этот список идентификаторов в расписание пользовательских сопоставлений (пар) :Сортировка списка кортежей, так что группировка по ключу не нужна
ids = [1, 2, 3, 4]
график, связанные с этим будет выглядеть так:
week 1: (1, 2), (3, 4)
week 2: (1, 3), (2, 4)
week 3: (1, 4), (2, 3)
week 4: (1, 2), (3, 4) [repeat of week 1]
и так далее. Я пытался сделать это с помощью вложенных for
циклов на основе количества идентификаторов пользователей и комбинаций, полученных в результате этого.
ids = [1,2,3,4]
matchups = []
#generate all the combinations of matchups
for subset in itertools.combinations(ids,2):
matchups.append(subset)
Это возвращает все потенциальные пары как список кортежей - отлично! В этом суть того, что я ищу. Моя проблема теперь выясняет, как превратить это во что-то полезное. Например, приведенный выше код возвращает этот список для matchups
:
[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
Я пытался сложную рекурсивную функцию, чтобы создать список уникальных спариваний для каждой недели, потом я понял, что если у меня есть выше список в Правильный порядок, я могу просто использовать его, чтобы назначить пары от начала до конца, независимо от недели, и повторять, когда я дойду до конца. То есть, я могу просто назначить пары недель, используя известное количество спаев, необходимых в неделю, и известное количество недель.
С этой целью я пытался выяснить, как сортировать список кортежей на основе элементов, которые являются не равным. Метод sorted()
имеет множество полезных реализаций такого типа ситуаций, но я могу получить результаты только в том случае, если результаты сгруппированы, например, выше.
Я хотел бы найти применение sorted()
, который будет возвращать следующий, почти как анти-рода:
[(1, 2), (3, 4), (1, 3), (2, 4), (1, 4), (2, 3)]
Есть ли способ использовать lambda
для этого?
EDIT: Я только что понял, что 1-й элемент должен быть сопряжен с 6-м, 2-м, 5-м и 3-м с 4-м. Я не знаю, распространяется ли это на общий случай, но я ожидаю, что это возможно, потому что я предпринял другие шаги, чтобы гарантировать, что всегда есть четное число идентификаторов.
Теперь я уверен, что есть способ интерполировать список, чтобы достичь этого.
EDIT2: Похоже, предыдущая догадка не была правильной - она не работает с 6 идентификаторами, и, вероятно, все, что за ее пределами, тоже потерпит неудачу. Я вернусь к тому, чтобы выяснить, есть ли способ разгона вместо сортировки на основе ключа
'random.shuffle' является анти-рода :) –
Очень true- я понял, моя терминология не была великорусского это больше, как мне нужно, чтобы обеспечить уникальность, а не группировка по ключу. – dkhaupt
Почему вы не можете использовать цикл for? Порядок второго списка - это просто '0 5 1 4 2 3'. –