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 sys.path详细介绍
Oct 17 Python
在python的WEB框架Flask中使用多个配置文件的解决方法
Apr 18 Python
python实现跨文件全局变量的方法
Jul 07 Python
python中zip和unzip数据的方法
May 27 Python
Python实现识别手写数字大纲
Jan 29 Python
学习python中matplotlib绘图设置坐标轴刻度、文本
Feb 07 Python
python中嵌套函数的实操步骤
Feb 27 Python
python实现多线程端口扫描
Aug 31 Python
使用Python的Turtle绘制哆啦A梦实例
Nov 21 Python
python中selenium库的基本使用详解
Jul 31 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
Dec 17 Python
python中字符串String及其常见操作指南(方法、函数)
Apr 06 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错误提示的关闭方法详解
2013/06/23 PHP
PHP中的数组处理函数实例总结
2016/01/09 PHP
yii2中关于加密解密的那些事儿
2018/06/12 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
Jquery 组合form元素为json格式,asp.net反序列化
2009/07/09 Javascript
Prototype 学习 工具函数学习($A方法)
2009/07/12 Javascript
jQuery $.get 的妙用 访问本地文本文件
2012/07/12 Javascript
jquery对元素拖动排序示例
2014/01/16 Javascript
php+ajax+jquery实现点击加载更多内容
2015/05/03 Javascript
JavaScript中的Repaint和Reflow用法详解
2015/07/27 Javascript
jquery实现的横向二级导航效果代码
2015/08/26 Javascript
整理Javascript函数学习笔记
2015/12/01 Javascript
javascript解决小数的加减乘除精度丢失的方案
2016/05/31 Javascript
JavaScript组合模式学习要点
2016/08/26 Javascript
AngularJS 单选框及多选框的双向动态绑定
2017/04/20 Javascript
js实现图片上传预览原理分析
2017/07/13 Javascript
vue-cli项目中使用echarts图表实例
2018/10/22 Javascript
vue组件通信传值操作示例
2019/01/08 Javascript
微信小程序云开发如何使用npm安装依赖
2019/05/18 Javascript
jQuery-App输入框实现实时搜索
2020/11/19 jQuery
详解Django中的过滤器
2015/07/16 Python
python中scikit-learn机器代码实例
2018/08/05 Python
对Python w和w+权限的区别详解
2019/01/23 Python
Django 实现图片上传和显示过程详解
2019/07/18 Python
Python如何读取文件中图片格式
2020/01/13 Python
CSS3实现swap交换动画
2016/01/19 HTML / CSS
HTML5 在canvas中绘制矩形附效果图
2014/06/23 HTML / CSS
洛杉矶生活休闲而精致的基础品牌:Mika Jaymes
2018/01/07 全球购物
优衣库美国官网:UNIQLO美国
2018/04/14 全球购物
阿迪达斯中国官网:Adidas中国
2020/12/14 全球购物
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
安全生产网格化管理实施方案
2014/03/01 职场文书
学生会竞选演讲稿怎么写
2014/08/26 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书
党的群众路线教育实践活动个人整改措施
2014/10/27 职场文书
css3手动实现pc端横向滚动
2022/06/21 HTML / CSS