-1

经过一些在线研究,似乎很多人倾向于将组合与排列混淆。

例子:

强力球彩票有 5 个号码 1 - 59 和最后一个强力球号码 1 - 35。

问题:

与 Excel 函数 COMBIN() 类似,无论内部顺序如何,如何生成一组或一组项目的所有组合?

组合与排列不同,排列的内部顺序很重要。

前 5 个:59 x 58 x 57 x 56 x 55 = 5、006、386

强力球:5,006,386 X 35 = 175、223、510

我希望您帮助我生成前 5 个组合,然后使用 First 5 + Powerball 生成一个单独的组合。

4

3 回答 3

3

正如其他答案和评论中所指出的,要生成“前 5 个”的所有组合,您可以使用itertools.combinations

first5 = itertools.combinations(range(1, 59+1), 5)

对于这些和“强力球”号码的乘积,请使用itertools.product

first5andPowerball = itertools.product(first5, range(1, 35+1))

这两个都是生成器对象。要将它们变成实际的列表,只需使用list函数,例如 ,list(first5)但这些列表会很大,我不知道您对它们有什么用处。

如果您只想获得一个随机组合(例如在抽奖中),则不使用要容易得多combinations,而是使用shuffle数字并选择前五个,就像洗一副纸牌并从顶部选择前五个:

numbers = range(1, 59+1)
random.shuffle(numbers)
first5 = numbers[:5]
bonus = random.randint(1, 35)
print first5, bonus

或者更简单,使用sample(感谢@dansalmo 的提示)

first5 = random.sample(range(1, 59+1), 5)
于 2013-10-19T18:52:16.533 回答
2

这是一个说明性示例,显示如何列出仅选择 6 个数字的游戏的组合:

>>> from itertools import combinations
>>> list(combinations(range(1, 6+1), 5))
[(1, 2, 3, 4, 5), (1, 2, 3, 4, 6), (1, 2, 3, 5, 6), (1, 2, 4, 5, 6),
(1, 3, 4, 5, 6), (2, 3, 4, 5, 6)]

以下是“前 5 个”组合数量的示例:

>>> len(list(combinations(range(1, 59+1), 5)))
5006386

如果您想要整个列表,只需删除该len()功能。

要获得 4 中选择 2 和 5 强力球的所有组合,需要采用两种组合的卡蒂斯乘积:

>>> list((x,y) for x in combinations(range(1,4+1),2) for y in range(1,5+1))
[((1, 2), 1), ((1, 2), 2), ((1, 2), 3), ((1, 2), 4), ((1, 2), 5), ((1, 3), 1), ((1, 3), 2), ((1, 3), 3), ((1, 3), 4), ((1, 3), 5), ((1, 4), 1), ((1, 4), 2), ((1, 4), 3), ((1, 4), 4), ((1, 4), 5), ((2, 3), 1), ((2, 3), 2), ((2, 3), 3), ((2, 3), 4), ((2, 3), 5), ((2, 4), 1), ((2, 4), 2), ((2, 4), 3), ((2, 4), 4), ((2, 4), 5), ((3, 4), 1), ((3, 4), 2), ((3, 4), 3), ((3, 4), 4), ((3, 4), 5)]

即使数字很小,您也可以看到组合增长的速度有多快!

要获得所有强力球组合将是:

>>> list((x,y) for x in combinations(range(1,59+1),2) for y in range(1,35+1))

但它对我的系统来说太大了。

添加 DSM 的评论:

使用产品创建生成器:

from itertools import combinations, product
cgen = product(combinations(range(1,59+1),5), range(1,35+1))
for c in cgen:
    #write c to file

或者您可以在写入文件之前收集一些 c。

每个组合将是以下形式的元组:((1, 2, 3, 4, 5), 1)

于 2013-10-19T18:04:46.167 回答
1

根据问题“是否可以针对该范围内的所有可能选秀权运行 5 个中奖乐透选秀权列表并找出它的索引?” 在@tobias_k 回答的评论中:

>>> from itertools import combinations
>>> all = list(combinations(range(1, 59+1), 5))
>>> all.index((1, 2, 3, 4, 59))
54
>>> all.index((32, 42, 43, 54, 59))
4922705

以上是可行的,但索引查找时间在列表末尾变得更长(< 1 秒)。尝试创建 dict 会导致我出现内存错误。

当然应该可以创建一个公式来导出索引而不创建列表。您应该将其作为另一个问题发布。

于 2013-10-19T23:11:03.113 回答