Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例


Posted in Python onNovember 23, 2017

本文实例讲述了Python2.7基于笛卡尔积算法实现N个数组的排列组合运算。分享给大家供大家参考,具体如下:

说明:本人前段时间遇到的求n个数组的所有排列组合的问题,发现笛卡尔积算法可以解决,但是网上搜索的只有Java版本的实现,于是自己试着用python实现,由于新手代码不太规范。

代码:本人封装了一个类Cartesian(笛卡尔),其中封装了变量和方法:

1.变量

datagroup : 表示n个list(python 中的list与其他编程中的数组定义类似)的集合,即一个二维数组
counterIndex:datagroup反向下标值
counter : 用来记录当前datagroup中每一个数组输出的下标,初始全为0,因为从第一个开始输出

2.方法

countlength : 计算数组长度,即计算n的具体值
handle :处理datagoroup二维数组中每一个一维数组输出的下标值
assemble : 对datagoroup中的n个一维数组中的每一元素进行排列组合输出

# -*- coding:utf-8 -*-
# python 实现N个数组的排列组合(笛卡尔积算法)
class Cartesian():
  # 初始化
  def __init__(self, datagroup):
    self.datagroup = datagroup
    # 二维数组从后往前下标值
    self.counterIndex = len(datagroup)-1
    # 每次输出数组数值的下标值数组(初始化为0)
    self.counter = [0 for i in range(0, len(self.datagroup))]
  # 计算数组长度
  def countlength(self):
    i = 0
    length = 1
    while(i < len(self.datagroup)):
      length *= len(self.datagroup[i])
      i += 1
    return length
  # 递归处理输出下标
  def handle(self):
    # 定位输出下标数组开始从最后一位递增
    self.counter[self.counterIndex]+=1
    # 判断定位数组最后一位是否超过长度,超过长度,第一次最后一位已遍历结束
    if self.counter[self.counterIndex] >= len(self.datagroup[self.counterIndex]):
      # 重置末位下标
      self.counter[self.counterIndex] = 0
      # 标记counter中前一位
      self.counterIndex -= 1
      # 当标记位大于等于0,递归调用
      if self.counterIndex >= 0:
        self.handle()
      # 重置标记
      self.counterIndex = len(self.datagroup)-1
  # 排列组合输出
  def assemble(self):
    length = self.countlength()
    i = 0
    while(i < length):
      attrlist = []
      j = 0
      while(j<len(self.datagroup)):
        attrlist.append(self.datagroup[j][self.counter[j]])
        j += 1
      print attrlist
      self.handle()
      i += 1

测试:

注:测试代码中我只选取了长度为3的二维数组

if __name__ == "__main__":
  # 构造二维数组
  datagroup = [['aa1', ], ['bb1', 'bb2'], ['cc1', 'cc2', 'cc3']]
  # 创建cartesian对象
  cartesian = Cartesian(datagroup)
  cartesian.assemble()

输出结果:

Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例

备注:此算法实现用python2.7版本

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

Python 相关文章推荐
Python标准库内置函数complex介绍
Nov 25 Python
Python实现批量转换文件编码的方法
Jul 28 Python
Windows中安装使用Virtualenv来创建独立Python环境
May 31 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
Sep 25 Python
python3 爬取图片的实例代码
Nov 06 Python
程序员写Python时的5个坏习惯,你有几条?
Nov 26 Python
Python中常用的内置方法
Jan 28 Python
django fernet fields字段加密实践详解
Aug 12 Python
详解Python 最短匹配模式
Jul 29 Python
python可视化之颜色映射详解
Sep 15 Python
用python基于appium模块开发一个自动收取能量的小助手
Sep 25 Python
Python闭包的定义和使用方法
Apr 11 Python
深入理解Python3 内置函数大全
Nov 23 #Python
Python内置函数delattr的具体用法
Nov 23 #Python
Python 内置函数memoryview(obj)的具体用法
Nov 23 #Python
Python3 操作符重载方法示例
Nov 23 #Python
Python3安装Scrapy的方法步骤
Nov 23 #Python
Python 和 JS 有哪些相同之处
Nov 23 #Python
深入理解Python分布式爬虫原理
Nov 23 #Python
You might like
农民C键的运用技巧
2020/03/04 星际争霸
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
2009/06/08 PHP
PHP文件读写操作之文件读取方法详解
2011/01/13 PHP
浅析php中jsonp的跨域实例
2013/06/21 PHP
PHP获取当前url的具体方法全面解析
2013/11/26 PHP
PHP使用CURL获取302跳转后的地址实例
2014/05/04 PHP
thinkPHP使用post方式查询时分页失效的解决方法
2015/12/09 PHP
php文件缓存方法总结
2016/03/16 PHP
zShowBox 图片放大展示jquery版 兼容性
2011/09/24 Javascript
js工具方法弹出蒙版
2013/05/08 Javascript
js实现幻灯片效果(基于jquery插件)
2013/11/05 Javascript
JavaScript学习笔记之JS对象
2015/01/22 Javascript
JS+CSS实现分类动态选择及移动功能效果代码
2015/10/19 Javascript
jQuery实用技巧必备(中)
2015/11/03 Javascript
Bootstrap每天必学之导航条
2015/11/27 Javascript
javascript与jquery动态创建html元素示例
2016/07/25 Javascript
JS出现失效的情况总结
2017/01/20 Javascript
angular-ngSanitize模块-$sanitize服务详解
2017/06/13 Javascript
原生JS+HTML5实现的可调节写字板功能示例
2018/08/30 Javascript
ES6 fetch函数与后台交互实现
2018/11/14 Javascript
javascript中undefined的本质解析
2019/07/31 Javascript
基于Express框架使用POST传递Form数据
2019/08/10 Javascript
[54:45]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 Optic vs OG
2018/04/02 DOTA
Python学习入门之区块链详解
2017/07/25 Python
Python操作mysql数据库实现增删查改功能的方法
2018/01/15 Python
Python设置在shell脚本中自动补全功能的方法
2018/06/25 Python
python在html中插入简单的代码并加上时间戳的方法
2018/10/16 Python
Django实现文件上传和下载功能
2019/10/06 Python
python如果快速判断数字奇数偶数
2019/11/13 Python
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
什么是方法的重载
2013/06/24 面试题
网络技术专业求职信
2014/02/18 职场文书
体育口号大全
2014/06/18 职场文书
先进教师个人总结
2015/02/11 职场文书
幼儿园教师培训心得体会
2016/01/21 职场文书
Android Flutter实现3D动画效果示例详解
2022/04/07 Java/Android