2014-12-06 99 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))