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。
答案 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]))]