#m个数,第一次抽取n1个,剩余中第二次抽n2个,依此第n次剩余中抽取nn个,则所有组合的排
#combine()函数借鉴于“窗边的扁豆”
i=0#全局变量,用于指向存放位置
outdata=[[]for i in range(61)]#全局变量,存放所有的排列结果
data=[1,2,3,4,5,6]#测试用数据,带抽取的m
temp=[[]for i in range(len(target_num))]#存储当前环节抽取的结果
step=0
select_data=[]#抽取值
target_num=[1,2,3]#每个环节抽取的数量
target=0#初始化当前环节,用于标记当前的环节
combine(data,step,select_data,target_num,target)
def combine(data,step,select_data,target_num,target):
global i
global outdata
global temp
if len(select_data)==target_num[target]:#选择的元素已经够了,就输出并且返回
temp[target]=select_data #临时存储当前环节抽取值
if target==len(target_num)-1:#如果抽取环节为最后环节,则输出各个抽取环节的抽取值
for lt in range(len(target_num)):#将各个环节抽取值拼接后放入输出结果outdata的全局变量中的第i组中
outdata[i].extend(temp[lt])
i=i+1#将全局变量i加1,使得输出抽取结果指向下一组
return
combine(list(set(data)-set(select_data)),0,[],target_num,target+1)#未抽取到最后环节,则运行下一环节抽取
return
if step >=len(data):#没有元素选了而且还没够,也是直接返回
return
select_data.append(data[step])#选择当前元素
combine(data,step+1,select_data,target_num,target)
select_data.pop()#别忘了从已选元素中剔除
combine(data,step+1,select_data,target_num,target)#不选择当前元素
def combinecount(m,n):#m个数中抽取n个数的组合数量
fenmu=1
fenzi=1
for i in range(m-n+1,m+1):
fenzi=fenzi*i
for j in range(1,n+1):
fenmu=fenmu*j
return fenzi/fenmu
def combineallcount(m_num,n_num):##m个数,第一次抽取n1个,剩余中第二次抽n2个,依此第n次剩余中抽取nn个,则所有组合数量
allcombine=1
m=len(m_num)#待抽取的m的初始值
n=0
for i in n_num:#抽取次数
n=n+i
if m>=n:#抽取n的总个数应小于等于m的个数
for j in n_num:#计算每次抽取的组合数量,计算总组合的数量
allcombine=allcombine*combinecount(m,j)
m=m-j#下个抽取环节剩余的m的个数
return allcombine
return print("抽取n的个数大于m的个数")