【发布时间】:2016-06-18 15:47:24
【问题描述】:
我有一个代表用户的 ID 列表,我正在编写一个函数来将该 ID 列表转换为用户匹配(配对)时间表,如下所示:
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]
等等。我试图根据用户 ID 的数量和由此产生的组合使用嵌套的 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?
编辑:我刚刚意识到第一个元素需要与第六个配对,第二个与第五个配对,第三个与第四个配对。我不知道这是否适用于一般情况,但我希望它是可能的,因为我已经采取了其他措施来确保始终有偶数个 ID。
现在我确信有一些方法可以插入列表来实现这一点。
EDIT2:看起来之前的预感是不正确的——它不适用于 6 个 ID,而且很可能除此之外的任何东西也会失败。我回来试图弄清楚是否有一种方法可以分散而不是基于键进行排序
【问题讨论】:
-
random.shuffle是反排序 :) -
非常正确-我意识到我的术语并不好-更像是我需要确保唯一性而不是按键分组。
-
为什么不能使用 for 循环?第二个列表的顺序就是
0 5 1 4 2 3。 -
@pp_ 这如何概括超过 4 个元素
-
当您说必须配对 1-6、2-5 和 3-4 时,我不清楚您的意思。这些对对您需要什么属性?例如,第 1-6 对使用 2 两次,而 4 则完全不使用。