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 相关文章推荐
json跨域调用python的方法详解
Jan 11 Python
30秒轻松实现TensorFlow物体检测
Mar 14 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
Sep 25 Python
python pygame实现2048游戏
Nov 20 Python
Django实现学员管理系统
Feb 26 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
Jun 19 Python
Python封装成可带参数的EXE安装包实例
Aug 24 Python
Python While循环语句实例演示及原理解析
Jan 03 Python
Python3监控疫情的完整代码
Feb 20 Python
使用Python绘制台风轨迹图的示例代码
Sep 21 Python
Django-celery-beat动态添加周期性任务实现过程解析
Nov 26 Python
Python函数中的不定长参数相关知识总结
Jun 24 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 flush无效,IIS7下php实时输出的方法
2016/08/25 PHP
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
深入理解JavaScript高级之词法作用域和作用域链
2013/12/10 Javascript
jquery链式操作的正确使用方法
2014/01/06 Javascript
jquery实现checkbox 全选/全不选的通用写法
2014/02/22 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
2014/05/11 Javascript
纯JS实现旋转图片3D展示效果
2015/04/12 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
2015/06/19 Javascript
PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)
2015/08/06 Javascript
JS+DIV+CSS排版布局实现美观的选项卡效果
2015/10/10 Javascript
jquery跟随屏幕滚动效果的实现代码
2016/04/13 Javascript
深入理解requestAnimationFrame的动画循环
2016/09/20 Javascript
原生js实现图片放大缩小计时器效果
2017/01/20 Javascript
js读取json文件片段中的数据实例
2017/03/09 Javascript
LayUi中接口传数据成功,表格不显示数据的解决方法
2018/08/19 Javascript
Webstorm2016使用技巧(SVN插件使用)
2018/10/29 Javascript
浅谈Vue.js 中的 v-on 事件指令的使用
2018/11/25 Javascript
koa+mongoose实现简单增删改查接口的示例代码
2019/05/13 Javascript
[01:16:01]VGJ.S vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Python备份目录及目录下的全部内容的实现方法
2016/06/12 Python
python调用xlsxwriter创建xlsx的方法
2018/05/03 Python
对TensorFlow中的variables_to_restore函数详解
2018/07/30 Python
python实现括号匹配的思路详解
2018/08/23 Python
在Python中实现替换字符串中的子串的示例
2018/10/31 Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
2019/01/29 Python
解决django同步数据库的时候app models表没有成功创建的问题
2019/08/09 Python
Python在OpenCV里实现极坐标变换功能
2019/09/02 Python
Python 随机生成测试数据的模块:faker基本使用方法详解
2020/04/09 Python
Python实现钉钉/企业微信自动打卡的示例代码
2021/02/02 Python
Pycharm 跳转回之前所在页面的操作
2021/02/05 Python
介绍一下如何利用路径遍历进行攻击及如何防范
2014/01/19 面试题
应届生法律顾问求职信
2013/11/19 职场文书
教师年度考核个人总结
2015/02/12 职场文书
2015年市场营销工作总结
2015/07/23 职场文书
java中用float时,数字后面加f,这样是为什么你知道吗
2021/09/04 Java/Android
基于Python和openCV实现图像的全景拼接详细步骤
2021/10/05 Python