使用循环中的参数具有不同数量的 for 循环的函数

Dan*_* V. 2 python python-3.x

首先我想说我已经读过这个帖子:

\n\n

具有不同数量的 For 循环的函数 (python)

\n\n

虽然它看起来确实与我想知道的相似,但我(根本)对递归还不够熟练,无法使其发挥作用。

\n\n

如果我有以下片段:

\n\n
I = ["i" + str(i+1) for i in range(3)]\nJ = ["j" + str(i+1) for i in range(4)]\nK = ["k" + str(i+1) for i in range(2)]\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我可以创建一个执行以下操作的函数:

\n\n
def f(*Sets):\n    size = len(Sets)\n    if size == 1:\n        for i in Sets[0]:\n            print(i)\n    elif size == 2:\n        for i in Sets[0]:\n            for j in Sets[1]:\n                print(i,j)\n    elif size == 3:\n        for i in Sets[0]:\n            for j in Sets[1]:\n                for k in Sets[2]:\n                    print(i,j,k)\n
Run Code Online (Sandbox Code Playgroud)\n\n

执行时,它会产生类似以下内容:

\n\n
>>f(I)\ni1\ni2\ni3\n\n>>f(I,J)\ni1,j1\ni1,j2\n...\ni3,j4\n\n>>f(I,J,K)\ni1,j1,k1\ni1,j1,k2\n...\ni3,j4,k2\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

print声明只是一个例子。我想在检查循环变量或字典的同时实际访问 pandas 数据框中的元素,因此它将包含一些命令,例如print(i,j,k, ":", dictionary[i,j,k]). 我需要访问循环中的每个变量,这就是我的意思。

\n\n

在我看来,可以使用某种递归来大大减少这一点。因为如果我需要四个列表,我就必须添加另一个elif. 但我没有递归思维,不知道如何解决它。

\n\n

或者也许根本无法完成。不再确定任何事情了:P

\n

sch*_*ggl 5

您可以使用递归来实现此目的,但最简单的方法是使用itertools.product

from itertools import product

def f(*sets):
    for p in product(*sets):
        # e.g. (1, 3, 5)
        print(*p)

>>> f([1, 2], [3, 4], [5, 6])
1 3 5
1 3 6
1 4 5
1 4 6
2 3 5
2 3 6
2 4 5
2 4 6
Run Code Online (Sandbox Code Playgroud)

product以惰性迭代器的形式返回输入可迭代对象的笛卡尔积tuples

笛卡尔积的简单递归实现将遵循以下原则:

def f(*sets):
    if not sets:
        return [[]]
    result = []
    for head in sets[0]:
        for combo in f(*sets[1:]):
            result.append([head] + combo)
    return result

>>> f([1, 2], [3, 4])
[[1, 3], [1, 4], [2, 3], [2, 4]]
Run Code Online (Sandbox Code Playgroud)