python 多层for循环转递归/迭代
使用场景
枚举组合:
问题是这样的.
有 n 个列表,分别从每个列表中取出一个元素,一共有多少种组合?
例如:
a = ['a1','a2']
b = ['b1','b2','b3']
组合结果为:
[('a1','b1'),('a1','b2'),('a1','b3'),('a2','b1'),('a2','b2'),('a2','b3')
]
待组合的列表只有两个
这种情况就是简单的遍历:
'''
遇到问题没人解答?小编创建了一个Python学习交流群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
a = ['a1','a2']
b = ['b1','b2','b3']res = []
for i in a:for j in b:res.append((i,j)])print(res)
扩展为 n 个
如果还用for循环嵌套,代码就是这样的
a = ['a1','a2']
b = ['b1','b2','b3']res = []
for i in a:for j in b:for k in c:......
如果是n层的话,这样的代码是无法表达的.
我们可以先将第一个和第二个组合,再拿组合出的结果和第三个组合,依次类推...
如下如所示:
用代码表示如下:
迭代
def merge(i,j):"""i = "a"j = ("b","c")return: ("a","b","c")"""res = []for p in (i,j):if isinstance(p,tuple):res.extend(p)else:res.append(p)return tuple(res)def combineN(*args):target = args[0]for li in args[1:]:tmp = []for i in target:for j in li:tmp.append(merge(i,j))target = tmpreturn target
递归
def merge(i,j):"""i = "a"j = ("b","c")return: ("a","b","c")"""res = []for p in (i,j):if isinstance(p,tuple):res.extend(p)else:res.append(p)return tuple(res)def combine2(a, b):res = []for i in a:for j in b:res.append(merge(i,j))return resdef combineNRecursion(*args):if len(args) == 2:return combine2(*args)return combine2(args[0],combineNRecursion(*args[1:]))
通用的多层 for 循环转迭代
上面用到的迭代方法是针对具体问题分析得来的,那么有没有一种通用的转换方案呢? 答案是肯定的.
def combineN(*li):res = []# 相当于最内层循环执行的次数.total_times = reduce(lambda x, y: x*y, [len(item) for item in li])n = 0while n < total_times:tmp = ntem_res = []for i in range(len(li)):# 余数就是参与计算的元素的下标,商用于计算下一个列表参与元素的下标.tmp, cur = divmod(tmp, len(li[i]))tem_res.append(li[i][cur])res.append(tem_res)n += 1return resres = combineN(["a1","a2"], ["b1", "b2"], ["c1", "c2"])
for i in res:print(i)
输出结果如下:
本文首发于python黑洞网,csdn同步更新
['a1', 'b1', 'c1']
['a2', 'b1', 'c1']
['a1', 'b2', 'c1']
['a2', 'b2', 'c1']
['a1', 'b1', 'c2']
['a2', 'b1', 'c2']
['a1', 'b2', 'c2']
['a2', 'b2', 'c2']
python 多层for循环转递归/迭代相关推荐
- Python进阶06 循环对象与迭代
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 这一讲的主要目的是为了大家在读Python程序的时候对循环对象有一个基本概念. 循 ...
- 递归python首尾相同的子字符串_推荐Python语言多层嵌套list的递归处理方法
本文主要向大家介绍了Python语言多层嵌套list的递归处理方法,希望对大家学习Python语言有所帮助. 问题:用Python处理一个多层嵌套list['and', 'B', ['not', 'A ...
- python执行循环内存变大_python – 为什么我的循环在每次迭代时需要更多内存?...
虽然脚本确实使用了相当多的内存,即使使用"较小"的示例值,答案也是如此 Does Python clone my entire environment each time the ...
- 牛顿插值多项式 Python 循环和递归两种实现思路
这里不介绍牛顿插值多项式数学推导,只提供Python循环和递归实现的思路与代码,想要学习牛顿插值多项式的同学可以去看数值分析课本等. 这里提供循环和递归两种思路,因为我是先想的递归,完整的代码和思路都 ...
- js遍历树,多层嵌套for循环,递归
js遍历树,多层嵌套for循环,递归 一.目的 源数据示例 二.如何获得数据 多层for循环嵌套遍历树数据 递归遍历树数据 一.目的 遍历获取树数据中的部分数据. 源数据示例 menuType=2的数 ...
- 利用Python求斐波那契数列的第N项以及前N项和(循环、递归、集合)
著名的斐波那契数列,即从第三项开始,每一项都等于前两项之和. 之前写过利用Java语言来编写,由于最近正在学Python,所以将自己的想法记录在此,有需要的朋友可以参考一下. 写在前面:这里的三个方法 ...
- python中for循环语句格式_python中for循环和可迭代对象遍历
#for循环和可迭代对象遍历 ''' for循环通常用于可迭代对象的遍历,for循环的语法格式如下: for 变量 in 可迭代对象 循环体语句 操作:遍历一个元组.集合.字典.字符串 ''' for ...
- python列表推导式中的多层for循环if-else嵌套
一.列表推导式中的if-else: 1.只有一个if [x for x in data if condition] 2.只有一个if-else [exp1 if condition e ...
- Python算法:推导、递归和规约
Python算法:推导.递归和规约 注:本节中我给定下面三个重要词汇的中文翻译分别是:Induction(推导).Recursion(递归)和Reduction(规约) 本节主要介绍算法设计的三个核心 ...
最新文章
- java.util.ServiceLoader源码分析
- 设计总结:腾讯光子《和平精英》全新UI 2.0如何升级至效果拉满?
- Oracle中REGEXP_SUBSTR函数
- CodeForces:103(div1)104(div2)
- FCPX插件:半调图像高级马赛克特效Yanobox Mosaic
- docker-compose搭建kafka集群
- c# mvc5 view 多层_三、 添加视图View(ASP.NET MVC5 系列)
- jquery 1~6
- 聊一个不常见的面试题:为什么数据库连接池不采用 IO 多路复用
- 移位和位运算相关算法题学习积累
- 【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析 Baseline
- usbserialch340驱动安装失败_【已解决】Mac中安装USB转串口的CH340G驱动
- 思维模型 时间管理矩阵
- 学会这几项windows操作,轻松玩转自己的个人电脑
- 十大歌手Python
- c语言ATM机文件储存账号密码,C语言ATM(有文件输入输出).doc
- 匀光匀色批处理软件(支持去雾)
- 一文搞定pandas的数据合并
- 通信里 星座图 到底是什么
- psv型号版本怎么看的
热门文章
- spark streaming性能优化
- (06)FPGA工程师能力
- (59)UART外设驱动用户接收模块(四)(第12天)
- leecode-3无重复字符串的最长子字符串C版-滑动窗口
- 【C/C++】值传递和址传递区别解析
- 数据恢复技术在计算机犯罪侦查中的应用,浅谈数据恢复技术在计算机犯罪侦查中的应用...
- 网关gateway解决跨域问题
- java5新特性_5分钟了解Java 12 八大新特性
- console.log()不显示结果_提醒低端电子显示屏易致视疲劳,OLED屏幕表现略好
- 【高校宿舍管理系统】第一章 建立数据库以及项目框架搭建