两个列表(男孩和女孩)的所有可能(单配)配对

3 投票
1 回答
731 浏览
提问于 2025-04-17 10:23

我有这两个列表:

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

我该如何组合出所有可能的(单一配对)[男孩, 女孩]呢?如果只有3个男孩和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 个回答

10

你所描述的其实是一个集合的排列组合。简单来说,就是把男孩的顺序保持不变,然后对女孩进行所有可能的排列组合,这样就能得到所有可能的配对方式:

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

撰写回答