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的Django框架中的中间件
Jul 24 Python
Python中的条件判断语句基础学习教程
Feb 07 Python
python多进程实现进程间通信实例
Nov 24 Python
python selenium UI自动化解决验证码的4种方法
Jan 05 Python
Django+Ajax+jQuery实现网页动态更新的实例
May 28 Python
解决python3 安装完Pycurl在import pycurl时报错的问题
Oct 15 Python
python模拟登陆,用session维持回话的实例
Dec 27 Python
python创建学生管理系统
Nov 22 Python
浅谈python输出列表元素的所有排列形式
Feb 26 Python
Python3自定义json逐层解析器代码
May 11 Python
解决pytorch 数据类型报错的问题
Mar 03 Python
基于Pygame实现简单的贪吃蛇游戏
Dec 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 explode函数实例代码
2012/02/27 PHP
PHP函数in_array()使用详解
2014/08/20 PHP
Discuz!X中SESSION机制实例详解
2015/09/23 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
2016/09/22 PHP
在线游戏大家来找茬II
2006/09/30 Javascript
jquery json 实例代码
2010/12/02 Javascript
javascript从右边截取指定字符串的三种实现方法
2013/11/29 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
js 性能优化之算法和流程控制
2017/02/15 Javascript
js学习总结_轮播图之渐隐渐现版(实例讲解)
2017/07/17 Javascript
jQuery扇形定时器插件pietimer使用方法详解
2017/07/18 jQuery
form表单数据封装成json格式并提交给服务器的实现方法
2017/12/14 Javascript
详解ajax的data参数错误导致页面崩溃
2018/04/30 Javascript
纯JS实现的读取excel文件内容功能示例【支持所有浏览器】
2018/06/23 Javascript
关于JavaScript 数组你应该知道的事情(推荐)
2019/04/10 Javascript
简单了解微信小程序的目录结构
2019/07/01 Javascript
js页面加载后执行的几种方式小结
2020/01/30 Javascript
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
Python实现简单字典树的方法
2016/04/29 Python
Python中的命令行参数解析工具之docopt详解
2017/03/27 Python
Python基础之getpass模块详细介绍
2017/08/10 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
2020/04/27 Python
python图片验证码识别最新模块muggle_ocr的示例代码
2020/07/03 Python
python产生模拟数据faker库的使用详解
2020/11/04 Python
Html5 web本地存储实例详解
2016/07/28 HTML / CSS
美国顶级水上运动专业店:Marine Products
2018/04/15 全球购物
Juice Beauty官网:有机美容产品,护肤与化妆品
2020/06/13 全球购物
群众路线教育党课主持词
2014/04/01 职场文书
对外汉语专业大学生职业生涯规划书
2014/10/11 职场文书
电工实训报告总结
2014/11/05 职场文书
学校元旦晚会开场白
2014/12/14 职场文书
张丽莉事迹观后感
2015/06/16 职场文书
初中政治教学工作总结
2015/08/13 职场文书
简历自我评价:教师师德表现自我评价
2019/04/24 职场文书
javascript条件式访问属性和箭头函数介绍
2021/11/17 Javascript