两个列表(男孩和女孩)的所有可能(一夫一妻制)配对

Posted

技术标签:

【中文标题】两个列表(男孩和女孩)的所有可能(一夫一妻制)配对【英文标题】:All possible (monogamous) pairings of two lists (of boys and girls) 【发布时间】:2012-01-16 21:42:37 【问题描述】:

我有这两个列表:

boys  = [1,2,3]
girls = [1,2,3]

您将如何构建所有可能的(一夫一妻制)配对[boy, girl]boysgirls 中只有 3 个,我认为这是所有可能配对的列表:

[
 [[1,1], [2,2], [3,3]],
 [[1,1], [2,3], [3,2]],
 [[1,2], [2,1], [3,3]],
 [[1,2], [2,3], [3,2]],
 [[1,3], [2,1], [3,2]],
 [[1,3], [2,2], [3,1]]
]

一般情况下你会如何做(以上格式)?这就是我能想到的......

pairs = list(itertools.product(boys, girls))
possible_pairings = []
for i, p in enumerate(pairs):
    if i % len(boys) == 0:
        print
    print list(p),
#   possible_pairings.append(pairing)

...给出这个输出。

[1, 1] [1, 2] [1, 3]
[2, 1] [2, 2] [2, 3]
[3, 1] [3, 2] [3, 3]

您将如何找到所有可能的配对(上面写出了具体示例)?这些就像您必须将 3x3 矩阵的元素相乘(以找到其行列式)的 6 种方法。 :)

Sven 几乎回答(加上我的enumerate

possible_pairings = []
possible_pairings_temp = []
boys  = ["b1", "b2", "b3"]
girls = ["g1", "g2", "g3"]

for girls_perm in itertools.permutations(girls):
    for i, (b, g) in enumerate(zip(boys, girls_perm)):
        possible_pairings_temp.append([b, g])
        if (i + 1) % len(boys) == 0: # we have a new pairings list
            possible_pairings.append(possible_pairings_temp)
            possible_pairings_temp = []
    print

print possible_pairings

这完全满足问题中的格式。

【问题讨论】:

同性恋配对怎么样? :) 【参考方案1】:

您所描述的是集合的排列。只需按照给定的顺序留下男孩,然后遍历女孩的所有排列 - 这将为您提供所有可能的配对:

boys = ["b1", "b2", "b3"]
girls = ["g1", "g2", "g3"]
for girls_perm in itertools.permutations(girls):
    for b, g in zip(boys, girls_perm):
        print b + g,
    print

打印

b1g1 b2g2 b3g3
b1g1 b2g3 b3g2
b1g2 b2g1 b3g3
b1g2 b2g3 b3g1
b1g3 b2g1 b3g2
b1g3 b2g2 b3g1

【讨论】:

能否请您展示一个使用itertools' permutations() 的具体示例?我知道“包括电池”,但可惜我没有在 itertools 中找到它们。 @courteous:我真的不明白你在问什么。你还没有在itertools 中找到permutations?你是怎么找的? 你如何让答案中的每一行(比如b1g1 b2g2 b3g3)出现在自己的列表中(就像我所有可能配对的例子一样)?我已将enumerate 添加到您的zip 中,但我得到了一个多余的(并且错误的)[[1, 1]] 配对列表(我已经更新了问题)。 好的,我想通了...模运算符% 优先于加法,因此(i + 1) 周围的大括号。谢谢斯文。

以上是关于两个列表(男孩和女孩)的所有可能(一夫一妻制)配对的主要内容,如果未能解决你的问题,请参考以下文章

1305. [CQOI2009]跳舞最大流+二分

P3153 [CQOI2009]跳舞 二分网络流

HDU-3081 Marriage Match II (最大流,二分答案,并查集)

稳定婚姻匹配问题

我恋爱了

P3153 [CQOI2009]跳舞