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的Django框架中使用通用视图的方法
Jul 21 Python
轻松掌握python设计模式之策略模式
Nov 18 Python
Django应用程序中如何发送电子邮件详解
Feb 04 Python
Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
Aug 07 Python
python实现可视化动态CPU性能监控
Jun 21 Python
Django添加sitemap的方法示例
Aug 06 Python
python发送多人邮件没有展示收件人问题的解决方法
Jun 21 Python
python对矩阵进行转置的2种处理方法
Jul 17 Python
python获取Linux发行版名称
Aug 30 Python
Django框架中间件定义与使用方法案例分析
Nov 28 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
Feb 25 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
Mar 03 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
VIM中设置php自动缩进为4个空格的方法详解
2013/06/14 PHP
显示程序执行时间php函数代码
2013/08/29 PHP
PHP实现的解汉诺塔问题算法示例
2018/08/06 PHP
PHP中数组转换为SimpleXML教程
2019/01/27 PHP
php用xpath解析html的代码实例讲解
2019/02/14 PHP
php实现 master-worker 守护多进程模式的实例代码
2019/07/20 PHP
动态调用css文件——jquery的应用
2007/02/20 Javascript
js 模拟实现类似c#下的hashtable的简单功能代码
2010/01/24 Javascript
jQuery 核心函数以及jQuery对象
2010/03/23 Javascript
分享27款非常棒的jQuery 表单插件
2011/03/28 Javascript
jQuery源码解读之addClass()方法分析
2015/02/20 Javascript
Js 获取、判断浏览器版本信息的简单方法
2016/08/08 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
2016/09/19 Javascript
懒加载实现的分页&&网站footer自适应
2016/12/21 Javascript
原生JS和jQuery操作DOM对比总结
2017/01/19 Javascript
解决Vue使用mint-ui loadmore实现上拉加载与下拉刷新出现一个页面使用多个上拉加载后冲突问题
2017/11/07 Javascript
一步步教你利用webpack如何搭一个vue脚手架(超详细讲解和注释)
2018/01/08 Javascript
Webpack 4.x搭建react开发环境的方法步骤
2018/08/15 Javascript
[04:45]DOTA2-DPC中国联赛正赛 iG vs LBZS 赛后选手采访
2021/03/11 DOTA
Python实现批量执行同目录下的py文件方法
2019/01/11 Python
python中metaclass原理与用法详解
2019/06/25 Python
python3 批量获取对应端口服务的实例
2019/07/25 Python
基于TensorFlow常量、序列以及随机值生成实例
2020/01/04 Python
Python爬虫之爬取淘女郎照片示例详解
2020/07/28 Python
python实现定时发送邮件到指定邮箱
2020/12/23 Python
澳大利亚牛仔裤商店:Just Jeans
2016/10/13 全球购物
临床医学专业个人的自我评价
2013/09/27 职场文书
工厂保洁员岗位职责
2013/12/04 职场文书
师德建设实施方案
2014/03/21 职场文书
假面舞会策划方案
2014/05/29 职场文书
吃空饷专项整治方案
2014/10/27 职场文书
社区义诊通知
2015/04/24 职场文书
学校运动会感想
2015/08/10 职场文书
美甲店的创业计划书模板
2019/08/23 职场文书
JavaScript中的宏任务和微任务详情
2021/11/27 Javascript