码迷,mamicode.com
首页 > 其他好文 > 详细

全排列

时间:2017-04-08 12:33:56      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:列表   range   list   记录   int   pytho   for   dex   cal   

step 1: 列表的全排列:

这个版本比较low

def permutation(li,index):
    for i in range(index,len(li)):
        if index == len(li)-1:
            print(li)
            return
        tmp = li[index]
        li[index] = li[i]
        li[i] = tmp
        permutation(li,index+1)
        tmp = li[index]
        li[index] = li[i]
        li[i] = tmp

调用:

permutation([1,2,3,4],0)

step2: 字符串的全排列:

def permutation(str):
    li = list(str)
    cnt = 0  #记录全排列的总数
    def permutation_list(index):
        if index == len(li) -1:
            nonlocal cnt
            cnt += 1
            print(li)
        for i in range(index,len(li)):
            li[index],li[i] = li[i],li[index]
            permutation_list(index+1)
            li[index], li[i] = li[i], li[index]

    ret = permutation_list(0)
    print("共有%d中全排列" % cnt)
    return ret

备注:

在闭包中,内部函数依然维持了外部函数中自由变量的引用—单元。内部函数不能修改单元对象的值(但是可以引用)。若尝试修改,则解释器会认为它是局部变量。这类似于全局变量和局部变量的关系。如果在函数内部修改全局变量,必须加上global声明,但是对于自由变量,尚没有类似的机制。所以,只能使用列表。(python3中引入了关键字:nonlocal)

测试:

permutation(abcd)

[‘a‘, ‘b‘, ‘c‘, ‘d‘]
[‘a‘, ‘b‘, ‘d‘, ‘c‘]
[‘a‘, ‘c‘, ‘b‘, ‘d‘]
[‘a‘, ‘c‘, ‘d‘, ‘b‘]
[‘a‘, ‘d‘, ‘c‘, ‘b‘]
[‘a‘, ‘d‘, ‘b‘, ‘c‘]
[‘b‘, ‘a‘, ‘c‘, ‘d‘]
[‘b‘, ‘a‘, ‘d‘, ‘c‘]
[‘b‘, ‘c‘, ‘a‘, ‘d‘]
[‘b‘, ‘c‘, ‘d‘, ‘a‘]
[‘b‘, ‘d‘, ‘c‘, ‘a‘]
[‘b‘, ‘d‘, ‘a‘, ‘c‘]
[‘c‘, ‘b‘, ‘a‘, ‘d‘]
[‘c‘, ‘b‘, ‘d‘, ‘a‘]
[‘c‘, ‘a‘, ‘b‘, ‘d‘]
[‘c‘, ‘a‘, ‘d‘, ‘b‘]
[‘c‘, ‘d‘, ‘a‘, ‘b‘]
[‘c‘, ‘d‘, ‘b‘, ‘a‘]
[‘d‘, ‘b‘, ‘c‘, ‘a‘]
[‘d‘, ‘b‘, ‘a‘, ‘c‘]
[‘d‘, ‘c‘, ‘b‘, ‘a‘]
[‘d‘, ‘c‘, ‘a‘, ‘b‘]
[‘d‘, ‘a‘, ‘c‘, ‘b‘]
[‘d‘, ‘a‘, ‘b‘, ‘c‘]
共有24中全排列

 

step3 : 使用python标准库

import itertools
t = list(itertools.permutations([1,2,3,4]))
print(t)

可以指定排列的位数:

import itertools
t = itertools.permutations([1,2,3,4],3) #只排列3位

 

全排列

标签:列表   range   list   记录   int   pytho   for   dex   cal   

原文地址:http://www.cnblogs.com/hupeng1234/p/6681275.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!