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 相关文章推荐
Django集成百度富文本编辑器uEditor攻略
Jul 04 Python
Python lambda和Python def区别分析
Nov 30 Python
Python、Javascript中的闭包比较
Feb 04 Python
Python决策树之基于信息增益的特征选择示例
Jun 25 Python
Python实现基于C/S架构的聊天室功能详解
Jul 07 Python
Django集成CAS单点登录的方法示例
Jun 10 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
Aug 19 Python
python圣诞树编写实例详解
Feb 13 Python
Python+unittest+requests 接口自动化测试框架搭建教程
Oct 09 Python
如何用python开发Zeroc Ice应用
Jan 29 Python
python爬取豆瓣电影TOP250数据
May 23 Python
Python实现视频自动打码的示例代码
Apr 08 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中对xml读取的相关函数的介绍一
2008/06/05 PHP
PHP 面向对象 PHP5 中的常量
2010/05/05 PHP
PHP多维数组遍历方法(2种实现方法)
2015/12/10 PHP
javascript下4个跨浏览器必备的函数
2010/03/07 Javascript
jquery lazyload延迟加载技术的实现原理分析
2011/01/24 Javascript
点弹代码 点击页面任何位置都可以弹出页面效果代码
2012/09/17 Javascript
jquery Moblie入门—hello world的示例代码学习
2013/01/08 Javascript
js截取固定长度的中英文字符的简单实例
2013/11/22 Javascript
javascript中处理时间戳为日期格式的方法
2014/01/02 Javascript
javascript中不提供sleep功能如何实现这个功能
2014/05/27 Javascript
浅谈JavaScript函数节流
2014/12/09 Javascript
javascript和jquery实现设置和移除文本框默认值效果代码
2015/01/13 Javascript
JavaScript之数组(Array)详解
2015/04/01 Javascript
JavaScript 浏览器对象模型BOM使用介绍
2015/04/13 Javascript
Vue全家桶实践项目总结(推荐)
2017/11/04 Javascript
vue+express 构建后台管理系统的示例代码
2018/07/19 Javascript
node实现生成带参数的小程序二维码并保存到本地功能示例
2018/12/05 Javascript
es6基础学习之解构赋值
2018/12/10 Javascript
如何为vue的项目添加单元测试
2018/12/19 Javascript
vue+Element-ui实现分页效果
2020/11/15 Javascript
[38:51]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-CDEC
2014/05/22 DOTA
简单介绍Python中的readline()方法的使用
2015/05/24 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
2018/06/11 Python
Python实现带参数的用户验证功能装饰器示例
2018/12/14 Python
Python设计模式之迭代器模式原理与用法实例分析
2019/01/10 Python
Python实现将蓝底照片转化为白底照片功能完整实例
2019/12/13 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
2020/01/14 Python
PyPDF2读取PDF文件内容保存到本地TXT实例
2020/05/12 Python
html5 自定义播放器核心代码
2013/12/20 HTML / CSS
英国领先的大码时装品牌之一:Elvi
2018/08/26 全球购物
意大利在线眼镜精品店:Ottica Lipari
2019/11/11 全球购物
党支部三会一课计划
2014/09/24 职场文书
党的群众路线教育实践活动个人整改方案
2014/10/25 职场文书
HTML5 语义化标签(移动端必备)
2021/08/23 HTML / CSS
国产动画《万圣街》日语配音版制作决定!
2022/03/20 国漫
MySQL 外连接语法之 OUTER JOIN
2022/04/09 MySQL