使用场景

枚举组合:

问题是这样的.

有 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循环转递归/迭代相关推荐

  1. Python进阶06 循环对象与迭代

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 这一讲的主要目的是为了大家在读Python程序的时候对循环对象有一个基本概念. 循 ...

  2. 递归python首尾相同的子字符串_推荐Python语言多层嵌套list的递归处理方法

    本文主要向大家介绍了Python语言多层嵌套list的递归处理方法,希望对大家学习Python语言有所帮助. 问题:用Python处理一个多层嵌套list['and', 'B', ['not', 'A ...

  3. python执行循环内存变大_python – 为什么我的循环在每次迭代时需要更多内存?...

    虽然脚本确实使用了相当多的内存,即使使用"较小"的示例值,答案也是如此 Does Python clone my entire environment each time the ...

  4. 牛顿插值多项式 Python 循环和递归两种实现思路

    这里不介绍牛顿插值多项式数学推导,只提供Python循环和递归实现的思路与代码,想要学习牛顿插值多项式的同学可以去看数值分析课本等. 这里提供循环和递归两种思路,因为我是先想的递归,完整的代码和思路都 ...

  5. js遍历树,多层嵌套for循环,递归

    js遍历树,多层嵌套for循环,递归 一.目的 源数据示例 二.如何获得数据 多层for循环嵌套遍历树数据 递归遍历树数据 一.目的 遍历获取树数据中的部分数据. 源数据示例 menuType=2的数 ...

  6. 利用Python求斐波那契数列的第N项以及前N项和(循环、递归、集合)

    著名的斐波那契数列,即从第三项开始,每一项都等于前两项之和. 之前写过利用Java语言来编写,由于最近正在学Python,所以将自己的想法记录在此,有需要的朋友可以参考一下. 写在前面:这里的三个方法 ...

  7. python中for循环语句格式_python中for循环和可迭代对象遍历

    #for循环和可迭代对象遍历 ''' for循环通常用于可迭代对象的遍历,for循环的语法格式如下: for 变量 in 可迭代对象 循环体语句 操作:遍历一个元组.集合.字典.字符串 ''' for ...

  8. python列表推导式中的多层for循环if-else嵌套

    一.列表推导式中的if-else: 1.只有一个if     [x for x in data if condition] 2.只有一个if-else     [exp1 if condition e ...

  9. Python算法:推导、递归和规约

    Python算法:推导.递归和规约 注:本节中我给定下面三个重要词汇的中文翻译分别是:Induction(推导).Recursion(递归)和Reduction(规约) 本节主要介绍算法设计的三个核心 ...

最新文章

  1. java.util.ServiceLoader源码分析
  2. 设计总结:腾讯光子《和平精英》全新UI 2.0如何升级至效果拉满?
  3. Oracle中REGEXP_SUBSTR函数
  4. CodeForces:103(div1)104(div2)
  5. FCPX插件:半调图像高级马赛克特效Yanobox Mosaic
  6. docker-compose搭建kafka集群
  7. c# mvc5 view 多层_三、 添加视图View(ASP.NET MVC5 系列)
  8. jquery 1~6
  9. 聊一个不常见的面试题:为什么数据库连接池不采用 IO 多路复用
  10. 移位和位运算相关算法题学习积累
  11. 【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析 Baseline
  12. usbserialch340驱动安装失败_【已解决】Mac中安装USB转串口的CH340G驱动
  13. 思维模型 时间管理矩阵
  14. 学会这几项windows操作,轻松玩转自己的个人电脑
  15. 十大歌手Python
  16. c语言ATM机文件储存账号密码,C语言ATM(有文件输入输出).doc
  17. 匀光匀色批处理软件(支持去雾)
  18. 一文搞定pandas的数据合并
  19. 通信里 星座图 到底是什么
  20. psv型号版本怎么看的

热门文章

  1. spark streaming性能优化
  2. (06)FPGA工程师能力
  3. (59)UART外设驱动用户接收模块(四)(第12天)
  4. leecode-3无重复字符串的最长子字符串C版-滑动窗口
  5. 【C/C++】值传递和址传递区别解析
  6. 数据恢复技术在计算机犯罪侦查中的应用,浅谈数据恢复技术在计算机犯罪侦查中的应用...
  7. 网关gateway解决跨域问题
  8. java5新特性_5分钟了解Java 12 八大新特性
  9. console.log()不显示结果_提醒低端电子显示屏易致视疲劳,OLED屏幕表现略好
  10. 【高校宿舍管理系统】第一章 建立数据库以及项目框架搭建