如何修复列表索引超出范围?

时间:2019-11-12 21:24:12

标签: python list

我在这条线上有问题。我不太确定为什么它会使我的列表索引超出范围。到目前为止,我已经尝试了几种解决方案,但是没有一个起作用。

scoreboardSorted = sorted(scoreboard, key = lambda t: t[1], reverse = True)
# Print first 5
a = 0
for score in scoreboardSorted:
    print(str(score[0]) + ": " + str(score[1]) + " points")
    a = a + 1
    if a == 5:

这是此代码的完整部分

def endGame(points):
    scoreboard = []
    # Write score to scoreboard
    with open("scoreboard.csv", "a") as scoreboardFile:
        scoreboardWriter = csv.writer(scoreboardFile)
        scoreboardWriter.writerow([name, points])
    # Open scoreboard in read mode and store in memory
    scoreboardFile = open("scoreboard.csv", "rt")
    scoreboardReader = csv.reader(scoreboardFile)
    for i in scoreboardReader:
        scoreboard.append(i)
    print("\nGame over!")
    print("Well done " + str(name) + ", you got " + str(points) + " points.")
    print("\nTop 5:")
    # Sort list
    scoreboardSorted = sorted(scoreboard, key = lambda t: t[1], reverse = True)
    # Print first 5
    a = 0
    for score in scoreboardSorted:
        print(str(score[0]) + ": " + str(score[1]) + " points")
        a = a + 1
        if a == 5:
            break
    sys.exit()

回溯是这个

Traceback (most recent call last):
  File "E:\Nea\NEA-PROJECT.py", line 128, in <module>
    endGame(points)
  File "E:\Nea\NEA-PROJECT.py", line 30, in endGame
    scoreboardSorted = sorted(scoreboard, key = lambda t: t[1], reverse = True)
  File "E:\Nea\NEA-PROJECT.py", line 30, in <lambda>
    scoreboardSorted = sorted(scoreboard, key = lambda t: t[1], reverse = True)
IndexError: list index out of range

P.S:请不要仅发布解决方案并进行详细说明。我是一名仍在尝试学习的中学学生,如果您能抽出宝贵的时间并解释一下,我将不胜感激。预先感谢。

3 个答案:

答案 0 :(得分:2)

您的scoreboard缺少数据。例如,下表的第二行缺少第二个值。

a = [[1, 2], [3,], [5, 6]]
>>> sorted(a, key=lambda t: t[1])
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-341-fea6d7792ad0> in <module>
      1 a = [[1, 2], [3,], [5, 6]]
----> 2 sorted(a, key=lambda t: t[1])

<ipython-input-341-fea6d7792ad0> in <lambda>(t)
      1 a = [[1, 2], [3,], [5, 6]]
----> 2 sorted(a, key=lambda t: t[1])

IndexError: list index out of range

您可以使用三元数为缺失值提供默认值,例如零。

>>> sorted(a, key=lambda t: t[1] if len(t) > 1 else 0)
[[3], [1, 2], [5, 6]]

答案 1 :(得分:2)

如果t[1]t中的一项)的值小于2(1或0),则无法在lambda函数中使用

scoreboard。这可能意味着您的csv文件中的值太少了。

您可以修复csv中的值,也可以在排序时回退到某些默认值:

scoreboardSorted = sorted(scoreboard, key = lambda t: t[1] if len(t) > 1 else 0, reverse = True)

请注意,我在这里使用0作为默认值,但是如果这样给您带来了错误的排序顺序或类型错误,则您必须找出另一个合适的值作为默认值。

答案 2 :(得分:0)

sorted(scoreboard, key=lambda t: t[1], reverse=True)

这假设scoreboards中的每个项目本身都是至少两个项目的序列。

听起来scoreboards中至少有一项少于两项。