我在这条线上有问题。我不太确定为什么它会使我的列表索引超出范围。到目前为止,我已经尝试了几种解决方案,但是没有一个起作用。
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:请不要仅发布解决方案并进行详细说明。我是一名仍在尝试学习的中学学生,如果您能抽出宝贵的时间并解释一下,我将不胜感激。预先感谢。
答案 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
中至少有一项少于两项。