【问题标题】:how to output the result of a nested loop using Python [closed]如何使用 Python 输出嵌套循环的结果 [关闭]
【发布时间】:2016-09-07 15:41:05
【问题描述】:

我有一个带有 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)

【问题讨论】:

    标签: python loops for-loop pandas dataframe


    【解决方案1】:

    range(x,y) 不包含值 y

    例如range(1,3) 包含数字[1,2] NOT [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)) 打印输出,但不知道如何使其成为数据框。
    • 对不起,我误解了你的问题,我现在编辑了我的答案以显示它正在转换为数据框
    【解决方案2】:

    我的建议是使用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 ...] 来消除再次循环或将每个元素转换为列表的需要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 2021-02-13
    • 1970-01-01
    相关资源
    最近更新 更多