我知道如何返回在20个可能的球罐中挑选3个球的所有可能组合的列表:
list(itertools.combinations(range(1,21),3))
但是如果我从两个罐子里拿出两个球(首先我会在一个5个球的罐子里挑一个球并在另一个罐子里再做一次)怎么办?我怎样才能得到所有组合的可能列表?
答案 0 :(得分:1)
假设第一个罐子里的球被编号为1
到20
,第二个罐子里的球是31
到35
,第三个罐子里的球是是41
到45
,所以我们可以保持球和罐直。然后,您将itertools.combinations
函数与itertools.product
结合起来,以获取所有可能性的列表:
list(product(combinations(range(1,21),3), range(31,36), range(41,46)))
这将列出一长串清单,共有28500项。列表中的第一项是
((1, 2, 3), 31, 41)
表示来自第一个jar的球1,2,3
,来自第二个jar的球31
和来自第三个jar的41
。最后一项是
((18, 19, 20), 35, 45)
具有明显的意义。如果你只想要一个没有任何内部元组的5个数字的元组,例如(1, 2, 3, 31, 41)
,你可以用多种方式“扁平化”元组,例如
[(*v[0], *v[-2:]) for v in
product(combinations(range(1,21),3), range(31,36), range(41,46))]