blend for vs和vs有什么差别_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层的话,这样的代码是无法表达的.

我们可以先将第一个和第二个组合,再拿组合出的结果和第三个组合,依次类推...

如下如所示:

20d89663efa61eb44359b05e46183314.png


用代码表示如下:

迭代

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 = tmp  return 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 res def 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 = 0    while n < total_times:        tmp = n        tem_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 += 1    return res res = combineN(["a1","a2"], ["b1", "b2"], ["c1", "c2"])for i in res:    print(i)

输出结果如下:

['a1', 'b1', 'c1']['a2', 'b1', 'c1']['a1', 'b2', 'c1']['a2', 'b2', 'c1']['a1', 'b1', 'c2']['a2', 'b1', 'c2']['a1', 'b2', 'c2']['a2', 'b2', 'c2']
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值