Python全排列操作实例分析


Posted in Python onJuly 24, 2018

本文实例讲述了Python全排列操作。分享给大家供大家参考,具体如下:

step 1: 列表的全排列:

这个版本比较low

# -*-coding:utf-8 -*-
#!python3
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)

运行结果:

[1, 2, 3, 4]
[1, 2, 4, 3]
[1, 3, 2, 4]
[1, 3, 4, 2]
[1, 4, 3, 2]
[1, 4, 2, 3]
[2, 1, 3, 4]
[2, 1, 4, 3]
[2, 3, 1, 4]
[2, 3, 4, 1]
[2, 4, 3, 1]
[2, 4, 1, 3]
[3, 2, 1, 4]
[3, 2, 4, 1]
[3, 1, 2, 4]
[3, 1, 4, 2]
[3, 4, 1, 2]
[3, 4, 2, 1]
[4, 2, 3, 1]
[4, 2, 1, 3]
[4, 3, 2, 1]
[4, 3, 1, 2]
[4, 1, 3, 2]
[4, 1, 2, 3]

step2: 字符串的全排列:

# -*-coding:utf-8 -*-
#!python3
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)

运行结果:

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

可以指定排列的位数:

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

运行结果:

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

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python最基本的数据类型以及对元组的介绍
Apr 14 Python
Python实现的数据结构与算法之链表详解
Apr 22 Python
Python中函数及默认参数的定义与调用操作实例分析
Jul 25 Python
Python利用BeautifulSoup解析Html的方法示例
Jul 30 Python
Python实现的凯撒密码算法示例
Apr 12 Python
Python实现的网页截图功能【PyQt4与selenium组件】
Jul 12 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
Apr 17 Python
pandas DataFrame创建方法的方式
Aug 02 Python
初次部署django+gunicorn+nginx的方法步骤
Sep 11 Python
使用pyplot.matshow()函数添加绘图标题
Jun 16 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
Jul 03 Python
Python2.6版本pip安装步骤解析
Aug 17 Python
python保存网页图片到本地的方法
Jul 24 #Python
python中reader的next用法
Jul 24 #Python
使用Flask集成bootstrap的方法
Jul 24 #Python
用python统计代码行的示例(包括空行和注释)
Jul 24 #Python
Python 删除整个文本中的空格,并实现按行显示
Jul 24 #Python
Python常见MongoDB数据库操作实例总结
Jul 24 #Python
Python实现端口检测的方法
Jul 24 #Python
You might like
php smarty模版引擎中的缓存应用
2009/12/02 PHP
php缓冲 output_buffering的使用详解
2013/06/13 PHP
使用配置类定义Codeigniter全局变量
2014/06/12 PHP
JavaScript 基于原型的对象(创建、调用)
2009/10/16 Javascript
用Javascript评估用户输入密码的强度实现代码
2011/11/30 Javascript
JQUERY实现左侧TIPS滑进滑出效果示例
2013/06/27 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
JS实现关闭当前页而不弹出提示框的方法
2016/06/22 Javascript
AngularJs  E2E Testing 详解
2016/09/02 Javascript
jQuery EasyUI右键菜单实现关闭标签/选项卡
2016/10/10 Javascript
JS中实现函数return多个返回值的实例
2017/02/21 Javascript
浅谈angularJS的$watch失效问题的解决方案
2017/08/11 Javascript
npm 更改默认全局路径以及国内镜像的方法
2018/05/16 Javascript
详解js实时获取并显示当前时间的方法
2019/05/10 Javascript
JavaScript工具库之Lodash详解
2019/06/15 Javascript
js实现上传图片并显示图片名称
2019/12/18 Javascript
vue从零实现一个消息通知组件的方法详解
2020/03/16 Javascript
JavaScript常用工具函数大全
2020/05/06 Javascript
JS自定义右键菜单实现代码解析
2020/07/16 Javascript
使用eslint和githooks统一前端风格的技巧
2020/07/29 Javascript
[56:24]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第二局
2016/03/04 DOTA
[01:20:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第四场 8.26
2018/08/30 DOTA
python strip() 函数和 split() 函数的详解及实例
2017/02/03 Python
详解Python import方法引入模块的实例
2017/08/02 Python
详解Python map函数及Python map()函数的用法
2017/11/16 Python
详解python string类型 bytes类型 bytearray类型
2017/12/16 Python
Python中fnmatch模块的使用详情
2018/11/30 Python
超全Python图像处理讲解(多模块实现)
2020/04/13 Python
Django Auth用户认证组件实现代码
2020/10/13 Python
主键(Primary Key)约束和唯一性(UNIQUE)约束的区别
2013/05/29 面试题
异步传递消息系统的作用
2016/05/01 面试题
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
个人现实表现材料
2014/02/04 职场文书
绿化工程实施方案
2014/03/17 职场文书
出生公证书样本
2014/04/04 职场文书
中餐厅经理岗位职责
2014/04/11 职场文书