for循环中的函数问题

时间:2014-07-18 20:37:48

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

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.55,1.3,3.8和1.5 4.5。

4 个答案:

答案 0 :(得分:5)

您正在寻找zip()功能:

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您的代码正在构建一个所谓的交叉产品,它将第一个列表中的每个值与第二个列表中的每个值组合在一起。你想要的是配对值,这与从每个列表中选择总是下一个值并将这些值放在一起相同。然后拍下下一个值,依此类推。由于这是一个非常常见的问题,它已经在python中可用了。这是拉链功能。这是一个如何使用它以及输出如何的示例:

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

答案 3 :(得分:-1)

嵌套列表推导就像嵌套循环一样,对于外部理解中的每个h实例,执行/评估内部理解中的每个R实例。每个列表中有四个,意味着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]))]