python 排列组合

#coding:utf-8
__author__ = 'similarface'
'''
序列的排列组合
'''
def permute(list):
    '''
    序列的排列数: abc=abc,acb,bac,aca,cab,cba
    :param list:
    :return:
    '''
    #接受任何序列
    if not list:
        #返回空序列
        return [list]
    else:
        res=[]
        for i in range(len(list)):
            #删除当前节点
            rest=list[:i]+list[i+1:]
            #排列其他的节点
            for x in permute(rest):
                #把当前节点添加到前面
                res.append(list[i:i+1]+x)
        return res

def subset(list, size):
    '''
    子排列
    :param list:
    :param size:
    :return:
    '''
    if size == 0 or not list:
        return [list[:0]]
    else:
        result=[]
        for i in range(len(list)):
            pick = list[i:i+1]
            rest = list[:i] + list[i+1:]
            for x in subset(rest, size-1):
                result.append(pick + x)
        return result

def combo(list, size):
    '''
    组合数
    :param list:
    :param size:
    :return:
    '''
    if size == 0 or not list:
        return [list[:0]]
    else:
        result = []
        for i in range(0, (len(list) - size) + 1):
            #重i出截断
            pick = list[i:i+1]
            rest = list[i+1:]
            #截断位置后的list继续组合
            for x in combo(rest, size - 1):
                result.append(pick + x)
        return result

if __name__=="__main__":
    print(permute([1,2,3]))
    print(permute('abc'))
    print(combo('abc', 2))
    print(subset([1, 2, 3], 2))
    '''
    [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
    ['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
    ['ab', 'ac', 'bc']
    [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]
    '''
原文地址:https://www.cnblogs.com/similarface/p/5129251.html