如何显示在一罐 20 个球中挑选 3 个球和在另外两个 5 球罐中挑选 1 个球的所有组合

How to show all combinations of picking 3 balls in a jar of 20 balls and 1 ball in two other jars of 5 balls

我知道如何return在一罐 20 个可能的球中挑选 3 个球的所有可能组合的列表:

list(itertools.combinations(range(1,21),3))

但是如果我有两个罐子里的两个球怎么办(首先我会从一个有 5 个球的罐子里挑一个球然后在另一个罐子里再做一次),我怎样才能得到所有可能的组合列表?

假设第一个罐子里的球编号为 120,第二个罐子里的球编号为 3135,而你的第三个罐子是 4145,所以我们可以让球和罐子保持直立。然后将 itertools.combinations 函数与 itertools.product 结合起来,得到所有可能性的列表:

list(product(combinations(range(1,21),3), range(31,36), range(41,46)))

这将构成一个长列表,包含 28500 个项目。列表中的第一项是

((1, 2, 3), 31, 41)

意思是第一个罐子里的球 1,2,3,第二个罐子里的球 31,第三个罐子里的 41。最后一项是

((18, 19, 20), 35, 45)

意思很明显。如果你只想要一个没有任何内部元组的 5 个数字的元组,例如 (1, 2, 3, 31, 41),你可以 "flatten" 多种方式的元组,例如

[(*v[0], *v[-2:]) for v in
    product(combinations(range(1,21),3), range(31,36), range(41,46))]