python - 使用循环中的参数具有不同数量的 for 循环的函数
问题描述
首先我想说我读过这个帖子:
虽然它看起来确实与我想知道的相似,但我(根本)不够精通递归以使其工作。
如果我有以下代码段:
I = ["i" + str(i+1) for i in range(3)]
J = ["j" + str(i+1) for i in range(4)]
K = ["k" + str(i+1) for i in range(2)]
然后我可以创建一个函数来做这样的事情:
def f(*Sets):
size = len(Sets)
if size == 1:
for i in Sets[0]:
print(i)
elif size == 2:
for i in Sets[0]:
for j in Sets[1]:
print(i,j)
elif size == 3:
for i in Sets[0]:
for j in Sets[1]:
for k in Sets[2]:
print(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
声明只是一个例子。我想在检查循环变量或字典的同时实际访问熊猫数据框中的元素,因此它将包含一些命令,例如print(i,j,k, ":", dictionary[i,j,k])
. 我需要访问循环中的每个变量,这就是我的意思。
在我看来,这可以使用某种递归来广泛减少。因为例如,如果我需要四个列表,我必须添加另一个elif
. 但是我没有递归类型的头脑,也看不出如何解决它。
或者,它可能根本无法完成。什么都不知道了:P
解决方案
您可以使用递归来实现这一点,但最简单的就是使用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
product
以惰性迭代器 over 的形式返回输入迭代的笛卡尔积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]]
推荐阅读
- spring - 异常参数索引超出范围:Java 中使用 Spring Batch ItemReader 时为 0
- javascript - 选择选项可以有多个值吗?
- html - 在 Google 表格中使用 ImportXML 抓取烂番茄分数
- swift - 范围内未找到 swift `.reduce` 函数参数
- python - 将对象重新编码为数值的问题
- mysql - 即使数据不存在,也可以选择查询所有 12 个月的结果
- node.js - 节点进程突然在 EC2 实例中达到 100% CPU
- php - 计算来自不同表php的多列
- python - 如何将来自其他模型的未来值添加到 LSTM (TF Keras) 模型以提高准确性?
- javascript - fullpage JS:移动视口中的锚点未准确导航到部分