2016-06-24 223 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是的,但請記住,您處於循環 –