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实现二叉树结构与进行二叉树遍历的方法详解
May 24 Python
Python实现自动上京东抢手机
Feb 06 Python
python使用__slots__让你的代码更加节省内存
Sep 05 Python
在Django admin中编辑ManyToManyField的实现方法
Aug 09 Python
Python使用configparser库读取配置文件
Feb 22 Python
Django单元测试中Fixtures的使用方法
Feb 26 Python
python函数调用,循环,列表复制实例
May 03 Python
一些关于python 装饰器的个人理解
Aug 31 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 Python
python使用隐式循环快速求和的实现示例
Sep 11 Python
python中%格式表达式实例用法
Jun 18 Python
Qt自定义Plot实现曲线绘制的详细过程
Nov 02 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
crontab无法执行php的解决方法
2016/01/25 PHP
PHP缓冲区用法总结
2016/02/14 PHP
浅谈Laravel中的三种中间件的作用
2019/10/13 PHP
PHP实现简单登录界面
2019/10/23 PHP
PHP7 foreach() 函数修改
2021/03/09 PHP
Tab页界面 用jQuery及Ajax技术实现(php后台)
2011/10/12 Javascript
JavaScript异步编程:异步数据收集的具体方法
2013/08/19 Javascript
Js获取数组最大和最小值示例代码
2013/10/29 Javascript
5款JavaScript代码压缩工具推荐
2014/07/07 Javascript
Egret引擎开发指南之创建项目
2014/09/03 Javascript
推荐4个原生javascript常用的函数
2015/01/12 Javascript
javascript实现根据时间段显示问候语的方法
2015/06/18 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
jQuery 常用代码集锦(必看篇)
2016/05/16 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
2016/05/30 Javascript
简单封装js的dom查询实例代码
2016/07/08 Javascript
JavaScript省市区三级联动菜单效果
2016/09/21 Javascript
浅谈EasyUI常用控件的禁用方法
2016/11/09 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
微信小程序wx:for循环的实例详解
2018/10/07 Javascript
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
2020/04/07 Javascript
详解Python的Django框架中的中间件
2015/07/24 Python
python处理csv数据动态显示曲线实例代码
2018/01/23 Python
python3 遍历删除特定后缀名文件的方法
2018/04/23 Python
python求最大值最小值方法总结
2019/06/25 Python
python向图片里添加文字
2019/11/26 Python
Python编程快速上手——正则表达式查找功能案例分析
2020/02/28 Python
一篇文章搞懂python的转义字符及用法
2020/09/03 Python
Sperry官网:帆船鞋创始品牌
2016/09/07 全球购物
凯特·丝蓓英国官网:Kate Spade英国
2016/11/07 全球购物
Marriott国际:万豪国际酒店查询预订
2017/09/25 全球购物
AT&T Wireless:手机、无限数据计划和配件
2018/06/03 全球购物
校庆活动方案
2014/03/31 职场文书
K8s部署发布Golang应用程序的实现方法
2021/07/16 Golang
CSS实现切角+边框+投影+内容背景色渐变效果
2021/11/01 HTML / CSS
vue修饰符.capture和.self的区别
2022/04/22 Vue.js