2014-07-18 172 views
0
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 ,3.8與3.8等等......)。for循環中的功能故障

但我想要的只是他們各自的配對,如下所示:0.8與1,1,1與1.25,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值列表。

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

嵌套列表內涵是一樣的嵌套循環,對於每一個實例h在你的外在理解中,你的內心理解中每個R的實例都被執行/評估。四個在每個列表中,裝置16次的結果(4×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]))] 
0

您的代碼建立一個所謂的叉積,它結合了從與在所述第二列表中的每個值的第一列表中的每個值。你需要的是配對值,這與總是從每個列表中選擇下一個值並將這些值放在一起相同。然後查看下一個值等等。由於這是一個相當普遍的問題,它已經可以在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)] 
+0

你能否擴展你的答案? –