2014-12-06 97 views
0

我寫了一些簡單的Python代碼,應該選擇主列表中每個列表的第二個元素,併爲用戶提供所有這些的總和值。它還應該將主列表中每個列表的第二和第三個元素相乘,然後對這些值求和。如何遍歷列表,並累積兩個字段的產品

然而,當我嘗試運行這段代碼,我面對的是一個

list index out of range 

錯誤。

usa_univs = [ ['California Institute of Technology',2175,37704], 
      ['Harvard',19627,39849], 
      ['Massachusetts Institute of Technology',10566,40732], 
      ['Princeton',7802,37000], 
      ['Rice',5879,35551], 
      ['Stanford',19535,40569], 
      ['Yale',11701,40500] ] 

def total_enrollment(usa_univs): 
    a = 0 
    c = (len(usa_univs)) -1 
    while c > 0: 
     a = a + ([c][1])   
     b = b + (([c][1])*([c][2])) 
     c = c - 1 
    print (a,b) 


print total_enrollment(usa_univs) 
+0

這不是一個壞問題。這裏的錯誤是基本的,但是OP想要做什麼(遍歷列表)是一個合理的問題。 – smci 2014-12-06 16:11:15

回答

0

您正在創建一個新名單每一次只有一個元素,那麼該索引:

[c][1] 

只有一個元素,即索引將失敗。如果c是一個索引usa_univs名單,你就需要引用列表:

usa_univs[c][1] 

然而,而不是手動管理索引到該列表中,請使用for循環訪問每個元素直接

a = 0 
b = 0 

for element in usa_univs: 
    a = a + element[1] 
    b = b + (element[1] * element[2]) 

其中我還將b設置爲0(您忘記了該部分),並且根本不再需要c

Python允許你將序列解壓縮成它們的組成部分;你甚至可以在for循環這樣做:

for name, a_value, b_value in usa_univs: 
    a = a + a_value 
    b = b + (a_value * b_value) 

,您可以使用augmented assignment使增加ab多了幾分緊湊:

for name, a_value, b_value in usa_univs: 
    a += a_value 
    b += a_value * b_value 

到底你的函數應使用return而不是打印。請打印至調用者;你已經這樣做了,但你的函數現在返回None。你的整個代碼,所有的這些改進,則是這樣的:

usa_univs = [ ['California Institute of Technology',2175,37704], 
      ['Harvard',19627,39849], 
      ['Massachusetts Institute of Technology',10566,40732], 
      ['Princeton',7802,37000], 
      ['Rice',5879,35551], 
      ['Stanford',19535,40569], 
      ['Yale',11701,40500] ] 

def total_enrollment(usa_univs): 
    a = 0 
    b = 0 
    for name, a_value, b_value in usa_univs: 
     a += a_value 
     b += a_value * b_value 
    return a, b 

print total_enrollment(usa_univs) 
0

而不是

[c][1] 

[c][2] 

您需要使用這個語法:

usa_univs[c][1] 
0

您忘記了usa_univs bef礦石[c][1]等。您還需要初始化b,否則您將在b = b + ((usa_univs[c][1])*(usa_univs[c][2]))中獲得參考分配之前的錯誤。

雖然不是很優雅,這應該工作:

def total_enrollment(usa_univs): 
    a = 0 
    b = 0 
    c = (len(usa_univs)) -1 
    while c > 0: 
     a = a + (usa_univs[c][1])   
     b = b + ((usa_univs[c][1])*(usa_univs[c][2])) 
     c = c - 1 
    print (a,b) 
0

爲,它說你忘了使用usa_univs [C] [1]

此外,使用簡單的Python的到迭代每個元素(不必擔心索引),並訪問單個元素

def total_enrollment(usa_univs): 
    a = 0 
    b = 0 
    for data in usa_univs: 
    a += data[1] 
    b += data[1] * data[2] 

    return a,b 

print (total_enrollment(usa_univs))