2016-06-24 166 views
1

这是一个嵌套循环的问题,我必须按字母顺序找到学生的名字,并以第二低的分数表示。
我收到以下错误:在Python中嵌套列表排序

Traceback (most recent call last): 
    File "solution.py", line 12, in <module> 
    if (l[i][0]==l[0][0]): 
IndexError: list index out of range 

以下是我完整的代码。

l=list() 
p=list() 
q=list() 
for i in range (int(raw_input())): 
    p=[raw_input(),int(raw_input())] 
    p.reverse() 
    l.append(p) 
l.sort() 
print len(l) 
for i in range(0,len(l)): 
    print "i= ",i 
    if (l[i][0]==l[0][0]): 
     l.remove(l[i]) 
print l 
for i in range(0,len(l)): 
    if (l[i][0]==l[0][0]): 
     q.append(l[i][1]) 
q.sort() 

for i in range(0,len(q)): 
    print q[i] 

我甚至已经打印了显示值在指定范围内的索引。请运行该功能查找以下输出:

4 
i= 0 
i= 1 
i= 2 
i= 3 

我会高兴,如果我从我的社区更好的方法,但我最关心的是我得到“索引超出范围”。它没有按错误在这里看起来不错

+0

您正在打印'i',但不是'l'。 – melpomene

+0

不要删除循环中的元素 – galaxyan

回答

1

问题是,您正在从循环中删除项目。拇指规则是,你不应该从列表中删除项目,同时迭代它。

我现在不太了解你的代码,但你可以改变你做第一个循环的方式,并为下一个循环应用相同的逻辑,至少你会得到你想要的。

这里的想法是用while语句,在每次迭代之后,您将有另一个列表大小的验证。与for循环同时,仅在第一次,因为范围将返回一个列表,for循环将迭代已经创建的列表。

l=list() 
p=list() 
q=list() 
for i in range (int(raw_input())): 
    p=[raw_input(),int(raw_input())] 
    p.reverse() 
    l.append(p) 
l.sort() 
print len(l) 
i = 0 
while i < len(l): 
    print "i= ",i 
    if (l[i][0]==l[0][0]): 
     l.remove(l[i]) 
    i += 1 
print l 
1

您使用的是remove,因为在某些时候,l的元素比您期望的要少。

+0

但是在执行删除之前,行中会出现错误,即第12行,而删除在第13行 –

+1

@DhrubKumar是的,但请记住,您处于循环 –