我有一个ID列表,代表用户。我正在编写一个函数,将这个ID列表转换成用户配对的日程表(pairings),如下:
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
循环来处理用户ID数量和由此产生的组合。
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
实现这个?编辑:我刚才意识到第一个元素需要与第六个元素配对,第二个与第五个,第三个与第四个。我不知道这是否推广到一般情况,但我认为可能是可能的,因为我已经采取了其他措施以确保始终有偶数个ID。
现在,我确定有一种方法可以插值列表以实现这一点。
编辑2:看起来之前的直觉是错误的 - 它不适用于6个ID,很可能任何超过6个ID的情况都会失败。我回来尝试找出一种基于密钥分散而不是排序的方法。
random.shuffle
是一种反排序的方法 :) - pp_0 5 1 4 2 3
。 - pp_