我的代码正在生成indexError

时间:2014-05-25 16:43:41

标签: python-3.x indexing syntax-error

我的代码提供了以下错误,任何人都可以帮助我解决出错的问题

if(RecentScores [count] .Score)< (RecentScores [count + 1] .Score): IndexError:列表索引超出范围

def rankScores(RecentScores):
  noMoreSwaps = False
  while not noMoreSwaps:
    noMoreSwaps = True
    for count in range (1,len(RecentScores)):                                  
      if (RecentScores[count].Score) < (RecentScores[count + 1].Score):
        noMoreSwaps = False
        tempScore = RecentScores[count].Score
        tempName = RecentScores[count].Name
        RecentScores[count].Score = RecentScores[count+1].Score      
        RecentScores[count].Name = RecentScores[count+1].Name
        RecentScores[count+1].Score = tempScore
        RecentScores[count+1].Name = tempName
  DisplayRecentScores(RecentScores)

如果有人可以提供帮助,我将非常感激

3 个答案:

答案 0 :(得分:1)

大多数编程语言中的索引以0 开头。在行

for count in range (1,len(RecentScores)): 

您正在从1循环到length - 1(我正在呼叫lengthlen(RecentScores))。但是在行

if (RecentScores[count].Score) < (RecentScores[count + 1].Score):

您正在使用索引

访问list/tuple
count + 1

让我们说循环是在 last 迭代中。 count的值为length - 1。然后,在if条件下,您尝试使用

访问list/tuple
RecentScores[length - 1 + 1]

相当于

RecentScores[length]

这将引发异常,因为您正在访问高于允许的索引。

你怎么解决?

为了避免使用不允许的索引,您可以将循环范围更改为更小的范围:

for count in range (1, len(RecentScores) - 1): 

答案 1 :(得分:0)

for count in range (1,len(RecentScores)):                                  
  if (RecentScores[count].Score) < (RecentScores[count + 1].Score):

此循环中的最大值count是RecentScores的长度。 然后在循环的最后一次迭代中,您尝试使用以下内容访问一个结尾: RecentScores[count + 1]

尝试访问此内容会为您提供所见的IndexError: list index out of range

循环索引从0开始,所以要解决此问题,您需要更改循环操作的范围:

    for count in range (0,len(RecentScores)-1): 

如果您要执行的操作是按照评论的建议对整个分数列表进行排序(请注意,这不是问题中的代码所做的那样),那么最好这样做:

sortedScores = sorted(RecentScores, key=lambda x: x.Score, reverse=True)

答案 2 :(得分:0)

for count in range(0,len(RecentScores)-1):始终记住索引从0开始并转到length-1。而且由于你要访问索引+ 1的东西,你还需要减1,因为范围(a,b)从a到b-1