【问题标题】:Variable number of loops in function (python)函数中的可变循环数(python)
【发布时间】:2018-09-16 06:47:50
【问题描述】:

这是我想做的一个例子:

d1 = {'a':1,'b':2,'c':3}
d2 = {'aa':11,'bb':22,'cc':33}
d3 = {'aaa':111,'bbb':222,'ccc':333}

def nLoop(*args):

    n = len(args)

    if n == 1:
        for k0,v0 in args[0].iteritems():
            print k0, v0

    if n == 2:
        for k0,v0 in args[0].iteritems():
            for k1,v1 in args[1].iteritems():
                print k0, v0, k1, v1

    if n == 3:
        for k0,v0 in args[0].iteritems():
            for k1,v1 in args[1].iteritems():
                for k2,v2 in args[2].iteritems():
                    print k0, v0, k1, v1, k2, v2

nLoop(d1,d2,d3)

我的问题是:有没有一些方法可以在没有 if 条件的情况下做到这一点?也许使用装饰器?

【问题讨论】:

  • 这里不是关于传递给函数的参数数量,而是关于添加嵌套循环的方式
  • 您可以查看模块itertools。您还应该能够编写一个返回生成器的函数,获取此类生成器的列表并遍历它们。

标签: python function loops nested python-decorators


【解决方案1】:

您可以将变量参数列表传递给itertools.product(使用生成器将字典转换为它们的项目),然后打印展平结果(因为product 返回元组的元组):

from __future__ import print_function
import itertools

d1 = {'a':1,'b':2,'c':3}
d2 = {'aa':11,'bb':22,'cc':33}
d3 = {'aaa':111,'bbb':222,'ccc':333}


def nLoop(*args):
    for t in itertools.product(*(a.items() for a in args)):
        print(*(x for a in t for x in a))

nLoop(d1,d2,d3)

这个新的nLoop 函数的输出与您的相同(如果不考虑顺序,因为字典顺序可能会在运行之间发生变化)

请注意,这是一个兼容 Python 3 的解决方案,但也适用于 Python 2。

【讨论】:

  • 你能帮忙吗。我的代码和那个有点不同
  • 如果我的代码没有帮助,也许你可以提出一个参考这个问题的问题,并解释什么对你不起作用?
  • 我已达到问题限制
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
  • 2016-07-23
  • 2019-07-15
  • 1970-01-01
  • 2022-11-18
相关资源
最近更新 更多