美文网首页程序员
可重复、不可重复取组合生成器python代码

可重复、不可重复取组合生成器python代码

作者: 勇赴 | 来源:发表于2017-01-12 11:22 被阅读566次

如abc三个元素,取两个相互组合,可重复取的话有,aa ab ac bb bc cc六种,不可重复取有 ab ac bc三种,从结果我可以看出,可重复取特点是,一个组合结果中,后一位元素的在原始序列中的索引大于等于前一位元素在原始原始序列中的索引,a的原始索引为0,b为1,c为2,aa 索引组合为00,ab为01,ac为02,bb为22,bc为23……以此类推。不可重复取组合的特点是一个组合结果中,后一位元素的在原始序列中的索引大于前一位元素在原始原始序列中的索引。ab 索引组合01,ac 为03,bc为13。
以下为python代码,思路都一样,两种写法。
第一种写法:

def combinations(array,cSpace,index,m):  
    #不可重复取组合生成器
    if(m==0):
        for i in range(cSpace.__len__()):
            print(cSpace[i],end='')
        print(' ',end='')
        return
    for i in range(array.__len__()):
        cSpace[index] = array[i];
        if index==0:
            combinations(array=array,cSpace=cSpace,index=index+1,m=m-1)    
        elif index>0:
            cIndex=array.index(cSpace[index])
            pIndex=array.index(cSpace[index-1])
            if cIndex>pIndex:
                combinations(array=array,cSpace=cSpace,index=index+1,m=m-1)  



def combinations_with_replacement(array,cSpace,index,m):  
    #可重复取组合生成器
    if(m==0):
        for i in range(cSpace.__len__()):
            print(cSpace[i],end='')
        print(' ',end='')
        return
    for i in range(array.__len__()):
        cSpace[index] = array[i];
        if index==0:
            combinations_with_replacement(array=array,cSpace=cSpace,index=index+1,m=m-1)    
        elif index>0:
            cIndex=array.index(cSpace[index])
            pIndex=array.index(cSpace[index-1])
            if cIndex>=pIndex:
                combinations_with_replacement(array=array,cSpace=cSpace,index=index+1,m=m-1)  



if __name__ == '__main__':
    array=list('abcd')#元素
    m=3#所取元素个数
    cSpace=list(range(m))
    combinations(array=array,cSpace=cSpace,index=0,m=m)
    print('')
    combinations_with_replacement(array=array,cSpace=cSpace,index=0,m=m)

第二种写法:
def combinations_with_replacement(array,cSpace,begin,index,m):
#不可重复取组合生成器
if(m==0):
for i in range(cSpace.len()):
print(cSpace[i],end='')
print(' ',end='')
return
realBegin=begin
if realBegin>0:
realBegin=begin-1
for i in range(realBegin,array.len()):
cSpace[index] = array[i];
combinations_with_replacement(array=array,cSpace=cSpace,begin=i+1,index=index+1,m=m-1)
def combinations(array,cSpace,begin,index,m):
#可重复取组合生成器
if(m==0):
for i in range(cSpace.len()):
print(cSpace[i],end='')
print(' ',end='')
return

        for i in range(begin,array.__len__()):
            cSpace[index] = array[i];
            combinations(array=array,cSpace=cSpace,begin=i+1,index=index+1,m=m-1)
if __name__ == '__main__':
    array=list('abcd')#元素
    m=3#所取元素个数
    cSpace=list(range(m))
    combinations(array=array,cSpace=cSpace,begin=0,index=0,m=m)
    print('')
    combinations_with_replacement(array=array,cSpace=cSpace,begin=0,index=0,m=m)

以上代码运行后的结果:
不可重复取abc abd acd bcd ;可重复取aaa aab aac aad abb abc abd acc acd add bbb bbc bbd bcc bcd bdd ccc ccd cdd ddd
python的itertools库里也有现成的组合和排列的实现,不过排列好像只实现了不可重复取,可重复取的并未实现。

相关文章

网友评论

    本文标题:可重复、不可重复取组合生成器python代码

    本文链接:https://www.haomeiwen.com/subject/pdjdbttx.html