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

Python 使用循环中的参数使用不同数量的for循环的函数,python,python-3.x,Python,Python 3.x,首先我想说的是,我读过这篇文章: 虽然它看起来确实和我想知道的很相似,但我对递归的熟练程度还不足以让它工作 如果我有以下代码片段: I=[“I”+str(I+1)表示范围(3)内的I] J=[“J”+str(i+1)表示范围(4)内的i] K=[“K”+str(i+1)表示范围(2)内的i] 然后我可以做一个函数,它可以这样做: def(*组): 尺寸=长度(套) 如果大小=1: 对于集合[0]中的i: 印刷品(一) elif大小==2: 对于集合[0]中的i: 对于集合[1]中的j: 打印

首先我想说的是,我读过这篇文章:

虽然它看起来确实和我想知道的很相似,但我对递归的熟练程度还不足以让它工作

如果我有以下代码片段:

I=[“I”+str(I+1)表示范围(3)内的I]
J=[“J”+str(i+1)表示范围(4)内的i]
K=[“K”+str(i+1)表示范围(2)内的i]
然后我可以做一个函数,它可以这样做:

def(*组):
尺寸=长度(套)
如果大小=1:
对于集合[0]中的i:
印刷品(一)
elif大小==2:
对于集合[0]中的i:
对于集合[1]中的j:
打印(i,j)
elif大小==3:
对于集合[0]中的i:
对于集合[1]中的j:
对于集合[2]中的k:
打印(i、j、k)
在执行时,它会产生如下结果:

>f(I)
i1
i2
i3
>>f(I,J)
i1,j1
i1,j2
...
i3,j4
>>f(I,J,K)
i1,j1,k1
i1,j1,k2
...
i3,j4,k2
print
语句只是一个例子。我希望在检查循环变量或字典的同时实际访问pandas数据帧中的元素,因此它将包含一些命令,如
print(I,j,k,“:”,dictionary[I,j,k])
。我需要访问循环中的每个变量,这就是我的意思

在我看来,这可以通过某种递归广泛减少。因为,例如,如果我需要四个列表,我必须添加另一个
elif
。但我没有递归思维,也不知道如何解决它


或者根本无法做到。什么都不确定:P

您可以使用递归来实现这一点,但最简单的方法就是使用:

product
以延迟迭代器的形式在
元组上返回输入可比项的笛卡尔乘积

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

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]]

您可以使用递归来实现这一点,但最简单的方法是:

product
以延迟迭代器的形式在
元组上返回输入可比项的笛卡尔乘积

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

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]]

非常感谢你。我不知道如何使用递归tho实现这一点,但这几乎可以实现。我没有注意到,但我没有强调这种输出格式的重要性。如果我想用逗号打印产品,会有类似的概括吗?例如:“i1,k1,j1”而不是“i1 k1 j1”。我用它来自动生成一个伪AMPL数据转换函数,这种语法非常挑剔。在最内层的for循环中执行什么操作取决于您自己。您有元组
p
:您不需要执行
print(*p)
,您还可以对它们进行迭代、转换或执行任何您喜欢的操作。例如,对于逗号分隔的输出,您可以执行打印(“,”.join(p))
。非常感谢您的帮助。现在我看得更清楚了。递归代码片段需要一段时间才能理解,但我的大脑就是这样工作的:P谢谢!递归需要一点时间才能完成,但一旦它单击,您就会喜欢它;)使用递归创建产品似乎是一个坏主意,因为它需要大约10行代码以交互方式解决这个问题……非常感谢。我不知道如何使用递归tho实现这一点,但这几乎可以实现。我没有注意到,但我没有强调这种输出格式的重要性。如果我想用逗号打印产品,会有类似的概括吗?例如:“i1,k1,j1”而不是“i1 k1 j1”。我用它来自动生成一个伪AMPL数据转换函数,这种语法非常挑剔。在最内层的for循环中执行什么操作取决于您自己。您有元组
p
:您不需要执行
print(*p)
,您还可以对它们进行迭代、转换或执行任何您喜欢的操作。例如,对于逗号分隔的输出,您可以执行打印(“,”.join(p))
。非常感谢您的帮助。现在我看得更清楚了。递归代码片段需要一段时间才能理解,但我的大脑就是这样工作的:P谢谢!递归需要一点时间才能完成,但一旦它单击,您就会喜欢它;)使用递归创建产品似乎是一个坏主意,因为它需要大约10行代码以交互方式解决这个问题。。。