如何使用Python输出嵌套循环的结果

3

我有一个带有3个参数的函数。我想计算该函数,并输出每个参数组合的结果。

我定义了我的函数F(A,B,C),现在我们可以假设它的输出是单个值f(A,B,C)

然后我运行了一个嵌套循环:

for A in range(1,2):
    for B in range(4,5):
        for C in range(7,8,9):
            F(A,B,C)

但它重写了之前的内容。我想得到的是这样一个数据框:
A   B   C   Output
1   4   7   f(1,4,7)
1   4   8   f(1,4,8)
1   4   9   f(1,4,9)
1   5   7   f(1,5,7)
1   5   8   f(1,5,8)
1   5   9   f(1,5,9)
2   4   7   f(2,4,7)
2   4   8   f(2,4,8)
2   4   9   f(2,4,9)
2   5   7   f(2,5,7)
2   5   8   f(2,5,8)
2   5   9   f(2,5,9)
2个回答

6

range(x,y) 不包含值y

例如,range(1,3) 包含数字 [1,2],而不是 [1,2,3]

for A in range(1,3):
    for B in range(4,6):
        for C in range(7,10):
            print(A,B,C)

输出:

1 4 7
1 4 8
1 4 9
1 5 7
1 5 8
1 5 9
2 4 7
2 4 8
2 4 9
2 5 7
2 5 8
2 5 9

这是你的范围正在做什么:
- `range(1,2)` --> [1] - `range(4,5)` --> [4] - `range(7,8,9)` --> [7](这个更难以处理,因为第三个参数是步长值)
你可以看到,你只是创建了3个仅有一个项的范围,所以当你循环时,它永远不会像你想要的那样重复,因为每个范围只有一个值。
这就是为什么你的程序输出(1,4,7),然后在将F改为打印时终止。在我的示例中,我将每个范围的第二个参数增加了1,以获得你想要的结果。
将其转换为数据帧:
listData = []
for A in range(1, 3):
    for B in range(4, 6):
        for C in range(7, 10):
            listData.append([A,B,C, A+B+C]) #I just used A+B+C instead of the func f

df = pandas.DataFrame(columns = ["A", "B", "C", "Output"], data = listData)
print(df)

谢谢,你说得对,这是一个愚蠢的错误。在实际情况中,我使用 [val1, val2, val3],因为它不是一个连续的列表。我可以通过 print(A,B,C,F(A,B,C)) 打印输出,但不知道如何将其转换为数据框。 - Ana
抱歉,我误解了您的问题,现在我已经编辑了我的答案,以展示它被转换为数据框。 - Keatinge

0
我的建议是使用itertools.product
import itertools
import pandas
# Assumes you know the inputs
A = [1, 2]
B = [4, 5]
C = [7, 8, 9]
# args = list(itertools.product(A, B, C))
args = [list(x) for x in itertools.product(A, B, C)]

def my_func(arg1, arg2, arg3):
    return arg1 + arg2 + arg3

正如你所看到的代码,它可以避免你使用嵌套循环。

现在你可以做一些像这样的事情:

for arg in args:
    arg.append(my_func(*arg))
df = pandas.DataFrame(args, columns=['A', 'B', 'C', 'SUM'])

你还可以使用[x + (my_func(*x),) for ...]来避免再次循环或将每个元素转换为列表。 - Tadhg McDonald-Jensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接