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语言的12个基础知识点小结
Jul 10 Python
python插入数据到列表的方法
Apr 30 Python
菜鸟使用python实现正则检测密码合法性
Jan 05 Python
用Python PIL实现几个简单的图片特效
Jan 18 Python
Python3.5 Pandas模块之DataFrame用法实例分析
Apr 23 Python
Python用字典构建多级菜单功能
Jul 11 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
Jul 22 Python
Python字符串中删除特定字符的方法
Jan 15 Python
python本地文件服务器实例教程
May 02 Python
Python如何识别银行卡卡号?
Jun 10 Python
Python机器学习应用之工业蒸汽数据分析篇详解
Jan 18 Python
python和Appium的移动端多设备自动化测试框架
Apr 26 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
PHP和JavaScrip分别获取关联数组的键值示例代码
2013/09/16 PHP
php读取大文件示例分享(文件操作类)
2014/04/13 PHP
PHP框架Swoole定时器Timer特性分析
2014/08/19 PHP
PHP面向对象详解(三)
2015/12/07 PHP
JavaScript 基于原型的对象(创建、调用)
2009/10/16 Javascript
DLL+ ActiveX控件+WEB页面调用例子
2010/08/07 Javascript
说明你的Javascript技术很烂的五个原因
2011/04/26 Javascript
js select option对象小结
2013/12/20 Javascript
Javascript中Array用法实例分析
2015/06/13 Javascript
js实现文本框输入文字个数限制代码
2015/12/25 Javascript
JavaScript中Form表单技术汇总(推荐)
2016/06/26 Javascript
针对后台列表table拖拽比较实用的jquery拖动排序
2016/10/10 Javascript
获取jqGrid中选择的行的数据
2016/11/30 Javascript
ES6新特性四:变量的解构赋值实例
2017/04/21 Javascript
nodejs实现的连接MySQL数据库功能示例
2018/01/25 NodeJs
详解vscode中vue代码颜色插件
2018/10/11 Javascript
JavaScript中关于base64的一些事
2019/05/06 Javascript
解决layui表格内文本超出隐藏的问题
2019/09/12 Javascript
利用numpy和pandas处理csv文件中的时间方法
2018/04/19 Python
Tensorflow读取并输出已保存模型的权重数值方式
2020/01/04 Python
TensorFlow实现保存训练模型为pd文件并恢复
2020/02/06 Python
python基于opencv 实现图像时钟
2021/01/04 Python
HTML5头部标签的一些常用信息小结
2016/10/23 HTML / CSS
如何保障Web服务器安全
2014/05/05 面试题
结构工程研究生求职信
2013/10/13 职场文书
在职人员函授期间自我评价分享
2013/11/08 职场文书
医学专业五年以上个人求职信
2013/12/03 职场文书
银行个人求职自荐信范文
2013/12/16 职场文书
优秀毕业生自我鉴定
2014/01/19 职场文书
《春天来了》教学反思
2014/04/07 职场文书
婚礼庆典答谢词
2015/01/20 职场文书
导游词之海南天涯海角
2019/12/05 职场文书
导游词之江南周庄
2019/12/06 职场文书
导游词之河北野三坡
2019/12/11 职场文书
pyqt5蒙版遮罩mask,setmask的使用
2021/06/11 Python
MySQ InnoDB和MyISAM存储引擎介绍
2022/04/26 MySQL