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 13 Python
简单学习Python time模块
Apr 29 Python
Python使用正则表达式过滤或替换HTML标签的方法详解
Sep 25 Python
python 实现对文件夹内的文件排序编号
Apr 12 Python
pygame实现俄罗斯方块游戏
Jun 26 Python
Python用csv写入文件_消除空余行的方法
Jul 06 Python
利用PyCharm Profile分析异步爬虫效率详解
May 08 Python
pyqt5 实现工具栏文字图片同时显示
Jun 13 Python
pandas分区间,算频率的实例
Jul 04 Python
Flask框架中request、请求钩子、上下文用法分析
Jul 23 Python
ansible动态Inventory主机清单配置遇到的坑
Jan 19 Python
Python时间操作之pytz模块使用详解
Jun 14 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数据库抽象层 PDO
2011/05/07 PHP
注册页面之前先验证用户名是否存在的php代码
2012/07/14 PHP
php简单计算年龄的方法(周岁与虚岁)
2016/12/06 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
picChange 图片切换特效的函数代码
2010/05/06 Javascript
jquery.boxy插件的iframe扩展代码
2010/07/02 Javascript
让人期待的2011年度最佳 jQuery 插件分享
2012/03/16 Javascript
JS的千分位算法实现思路
2013/07/31 Javascript
iframe调用父页面函数示例详解
2014/07/17 Javascript
项目中常用的JS方法整理
2015/01/30 Javascript
JavaScript实现自动对页面上敏感词进行屏蔽的方法
2015/07/27 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
jQuery ui实现动感的圆角渐变网站导航菜单效果代码
2015/08/26 Javascript
JS 循环li添加点击事件 (闭包的应用)
2016/12/10 Javascript
js 判断登录界面的账号密码是否为空
2017/02/08 Javascript
原生JS+Canvas实现五子棋游戏
2020/05/28 Javascript
解决vue项目报错webpackJsonp is not defined问题
2018/03/14 Javascript
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
2018/09/11 Javascript
关于React动态加载路由处理的相关问题
2019/01/07 Javascript
js核心基础之构造函数constructor用法实例分析
2019/05/11 Javascript
微信小程序用户授权、位置授权及获取微信绑定手机号
2019/07/18 Javascript
在vue中axios设置timeout超时的操作
2020/09/04 Javascript
vue项目开启Gzip压缩和性能优化操作
2020/10/26 Javascript
使用Python实现BT种子和磁力链接的相互转换
2015/11/09 Python
python实现人脸识别代码
2017/11/08 Python
python计算两个地址之间的距离方法
2018/06/09 Python
python itchat给指定联系人发消息的方法
2019/06/11 Python
树莓派与PC端在局域网内运用python实现即时通讯
2019/06/22 Python
Django单元测试中Fixtures用法详解
2020/02/25 Python
详解Python爬虫爬取博客园问题列表所有的问题
2021/01/18 Python
会计毕业生自我鉴定
2013/11/04 职场文书
优秀应届毕业生自荐信
2013/11/16 职场文书
4s店总经理岗位职责
2013/12/31 职场文书
2014政务公开实施方案
2014/02/19 职场文书
工会文体活动总结
2015/05/07 职场文书
Python内置数据类型中的集合详解
2022/03/18 Python