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深入学习之闭包
Aug 31 Python
Pthon批量处理将pdb文件生成dssp文件
Jun 21 Python
深入解析Python中函数的参数与作用域
Mar 20 Python
python基础教程之分支、循环简单用法
Jun 16 Python
python 中split 和 strip的实例详解
Jul 12 Python
python编写简易聊天室实现局域网内聊天功能
Jul 28 Python
python仿抖音表白神器
Apr 08 Python
python打包exe开机自动启动的实例(windows)
Jun 28 Python
Django框架创建mysql连接与使用示例
Jul 29 Python
Python Opencv提取图片中某种颜色组成的图形的方法
Sep 19 Python
Python + Requests + Unittest接口自动化测试实例分析
Dec 12 Python
python树莓派通过队列实现进程交互的程序分析
Jul 04 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的zip解压缩类pclzip使用示例
2014/03/14 PHP
PHP中检索字符串的方法分析【strstr与substr_count方法】
2017/02/17 PHP
PHP mkdir创建文件夹实现方法解析
2020/11/13 PHP
javascript setTimeout和setInterval 的区别
2009/12/08 Javascript
使用jQuery实现星级评分代码分享
2014/12/09 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
Vue.js实现图片的随意拖动方法
2018/03/08 Javascript
详解Vue取消eslint语法限制
2018/08/04 Javascript
浅谈ng-zorro使用心得
2018/12/03 Javascript
微信小程序动态添加view组件的实例代码
2019/05/23 Javascript
element-ui中Table表格省市区合并单元格的方法实现
2019/08/07 Javascript
微信小程序移动拖拽视图-movable-view实例详解
2019/08/17 Javascript
Elasticsearch实现复合查询高亮结果功能
2019/09/10 Javascript
vue 实现v-for循环回来的数据动态绑定id
2019/11/07 Javascript
Vue SPA 初次进入加载动画实现代码
2019/11/14 Javascript
[02:17]《辉夜杯》TRG战队巡礼
2015/10/26 DOTA
python合并文本文件示例
2014/02/07 Python
python中使用OpenCV进行人脸检测的例子
2014/04/18 Python
python服务器与android客户端socket通信实例
2014/11/12 Python
简单分析Python中用fork()函数生成的子进程
2015/05/04 Python
Pyinstaller将py打包成exe的实例
2018/03/31 Python
python 实现数字字符串左侧补零的方法
2018/12/04 Python
详解Python中namedtuple的使用
2020/04/27 Python
浅谈python处理json和redis hash的坑
2020/07/16 Python
CSS3 3D立方体效果示例-transform也不过如此
2016/12/05 HTML / CSS
深入剖析HTML5 内联框架iFrame
2016/05/04 HTML / CSS
挪威太阳镜和眼镜网上商城:SmartBuyGlasses挪威
2016/08/20 全球购物
澳大利亚领先的优质葡萄酒拍卖会:Langton’s Fine Wines
2019/03/24 全球购物
Java Servlet API中forward() 与redirect()的区别
2014/04/20 面试题
感恩寄语大全
2014/04/11 职场文书
青年教师个人总结
2015/02/11 职场文书
商务司机岗位职责
2015/04/10 职场文书
2016年村干部公开承诺书(公开承诺事项)
2016/03/25 职场文书
Go遍历struct,map,slice的实现
2021/06/13 Golang
解决persistence.xml配置文件修改存放路径的问题
2022/02/24 Java/Android