在日常的工作学习中,我们肯定会遇到排列组合问题,比如,在5种颜色的球中,任意取3个,共有多少种组合方式,这也包括有放回和无放回抽样。
成都创新互联服务项目包括绿园网站建设、绿园网站制作、绿园网页制作以及绿园网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,绿园网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到绿园省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
在python中,自带的排列组合函数,都在python的指导工具包itertools中。
product 笛卡尔积(有放回抽样排列)
permutations 排列(不放回抽样排列)
combinations 组合,没有重复(不放回抽样组合)
combinations_with_replacement 组合,有重复(有放回抽样组合)
python3中返回的为对象,可以通过迭代读取将值输出。
end
遍历一个序列中元素的所有可能的排列或组合。
itertools 模块提供了三个函数来解决这类问题。 其中一个是 itertools.permutations() , 它接受一个序列并产生一个元组序列,每个元组由序列中所有元素的一个可能排列组成,即通过打乱序列中元素排列顺序生成一个元组,比如:
如果想得到指定长度的所有排列,你可以传递一个可选的长度参数。比如:
使用 itertools.combinations() 可得到输入序列中元素的所有的组合。比如:
对于 combinations() 来讲,元素的顺序已经不重要了,即组合 ('a', 'b') 与 ('b', 'a') 其实是一样的,最终只会输出其中一个。
在计算组合的时候,一旦元素被选取就会从候选中剔除掉(比如如果元素’a’已经被选取了,那么接下来就不会再考虑它了)。 而函数 itertools.combinations_with_replacement() 允许同一个元素被选择多次,比如:
尽管手动可以实现排列组合算法,但是这样做比较麻烦,当遇到有些复杂的迭代问题时,可以先去看看itertools模块是否能实现,很有可能会在里面找到解决方案!
以上四种情况均为最常见的排列组合,从有无顺序和是否重复两个维度进行思考,建议理解并背诵。
在使用python计算排列组合之前,需要计算阶乘,可以有两种方式,一是使用math库中的factorial函数,二是使用如下的递归函数。
按照排列的公式:
按照组合的公式:
3.1 生日问题
假设一个班级中共有n个人,一年有365天,其中每天作为生日的概率是相等的,那么其中至少有两个人的生日在同一天的概率是多少?
此题属于全排列问题,需要反向思考,写出公式之后直接输入到python中计算
3.2 大乐透问题
大乐透的玩法是这样的,从35个红球中选择5个,从12个红球中选择2个,如果全中,那就中一等奖。那么请问,中一等奖的概率是多少?
此题属于组合问题,中奖的可能性为一种,因此分子为1,分母为所有的组合情况。
除了这3个数都选0个外共有239种组合,代码(缩进见图):
c=0
for i in range(5):
for j in range(6):
for k in range(8):
r='1.25+'*i+'2.5+'*j+'3+'*k
if r:
c+=1
print(r[:-1],'=',sum((1.25*i,2.5*j,3*k)),sep='')
print(f'共{c}种组合')