【问题标题】:Trouble with function in the for-loopfor循环中的功能问题
【发布时间】:2014-07-18 20:37:47
【问题描述】:
def vol_tank(R,h):
    ht = R + 2.3*R

    if ht >= h:
        vol = 3.14 * R*R * h + 3.14 * R*R * h / 3
        print ('R: %.1f , h: %.1f - volume: %.2f' % (R,h,vol))
    elif R >= h:
        vol = 3.14 * R*R * h / 3
        print ('R: %.1f , h: %.1f - volume: %.2f' % (R,h,vol))
    else:
        print ('R: %.1f , h: %.1f - overflowing' % (R,h))

values = [[0.8, 1, 1.3, 1.5], [1, 1.25, 3.8, 4.5]]
table = [[vol_tank(R,h) for R in values[0]] for h in values[1]]

->表格正在计算第一个“值”列表中的所有数字以及第二个列表中的所有数字(例如:0.8 和 1、0.8 和 1.25、0.8 和 3.8 等等......) .

但我想要的只是它们各自的配对,例如:0.8 与 1、1 与 1.25、1.3 与 3.8 和 1.5 与 4.5。

【问题讨论】:

  • 如果您控制输入,为什么它们在两个单独的列表中,为什么不成对出现?您的表列表也将充满 None

标签: python list if-statement for-loop function


【解决方案1】:

那么您正在寻找zip() 函数:

table = [vol_tank(R, h) for R, h in zip(*values)]

您应该从vol_tank() 返回结果,而不仅仅是打印,否则table 将是一个包含None 值的列表。

【讨论】:

    【解决方案2】:

    您可以从一开始就将值定义为对列表:

    values = [(0.8, 1) (1, 1.25), (1.3, 3.8), (1.5, 4.5)]
    

    或者使用zip函数:

    values = [[0.8, 1, 1.3, 1.5], [1, 1.25, 3.8, 4.5]]
    table = [vol_tank(R,h) for R, h in zip(values[0], values[1])]
    

    【讨论】:

      【解决方案3】:

      您的代码正在构建一个所谓的叉积,它将第一个列表中的每个值与第二个列表中的每个值组合在一起。您想要的是对值进行配对,这与始终从每个列表中选择下一个值并将这些值放在一起是相同的。然后 pic 下一个值等等。由于这是一个很常见的问题,它已经在 python 中可用。这是zip功能。这是一个如何使用它以及输出的示例:

      In [1]: values = [[0.8, 1, 1.3, 1.5], [1, 1.25, 3.8, 4.5]]
      In [2]: zip(*values)
      Out[2]: [(0.8, 1), (1, 1.25), (1.3, 3.8), (1.5, 4.5)]
      

      【讨论】:

      • 能否请您扩展您的答案?
      【解决方案4】:

      嵌套列表推导就像嵌套循环一样,对于外部推导中的每个 h 实例,内部推导中的每个 R 实例都会被执行/评估。每个列表中有 4 个,意味着 16 个结果 (4 x 4),相反,要么将值列表重新转换为元组列表,然后通过隐式解包遍历元组

      values = [(0.8, 1), (1, 1.25), (1.3, 3.8), (1.5, 4.5)]
      table = [vol_tank(R,h) for R, h in values]
      

      或者在列表的长度上循环一个整数索引(必须相同),如

      values = [[0.8, 1, 1.3, 1.5], [1, 1.25, 3.8, 4.5]]
      table = [vol_tank(values[0][i],values[1][i]) for i in range(len(values[0]))]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-21
        • 1970-01-01
        相关资源
        最近更新 更多