My python program keeps returning "KeyError: 20"
My python program keeps returning "KeyError: 20"
我在 python 中编写了一个程序,它应该 return 每个级别得分最高的玩家,但是它在第 69 行保持 returning "KeyError: 20" ( P_L1=players_TS[H_L1] ),我不知道如何解决这个问题。在我的代码中,我打开一个名为 "playerScores.txt" 的文本文件,其格式如下:
月亮,3,15
StarPlayer,2,18
艾莉,5,9
等等
这是我的代码:
print("The highest scorers for each leve are:\n")
PS3=open("PlayerScores.txt","r").read().split("\n")
level1_scores=[]
players_TS={}
level2_scores=[]
players_T2={}
level3_scores=[]
players_T3={}
level4_scores=[]
players_T4={}
level5_scores=[]
players_T5={}
for line in PS3:
lines=line.split(",")
player=lines[0]
level=lines[1]
score=lines[2]
erros=open("scoreboard_errorlog.text","w")
if int(score)>20:
errors.write(score)
if int(level)>5:
errors.write(level)
if int(level)==1:
level1_scores.append(int(score))
players_TS.setdefault(score,[]).append(player)
if int(level)==2:
level2_scores.append(int(score))
players_T2.setdefault(score,[]).append(player)
if int(level)==3:
level3_scores.append(int(score))
players_T3.setdefault(score,[]).append(player)
if int(level)==4:
level4_scores.append(int(score))
players_T4.setdefault(score,[]).append(player)
if int(level)==5:
level5_scores.append(int(score))
players_T5.setdefault(score,[]).append(player)
H_L1=max(level1_scores)
P_L1=players_TS[H_L1]
H_L2=max(level2_scores)
P_L2=players_T2[H_L2]
H_L3=max(level3_scores)
P_L3=players_T3[H_L3]
H_L4=max(level4_scores)
P_L4=players_T4[H_L4]
H_L5=max(level5_scores)
P_L5=players_T5[H_L5]
print("Level\tPlayer name\tScore\nLevel 1\t",P_L1,"\t",H_L1,"\nLevel 2\t",P_L2,"\t",H_L2,"\nLevel 3\t",P_L3,"\t",H_L3,"\nLevel 4\t",P_L4,"\t",H_L4,"\nLevel 5\t",P_L5,"\t",H_L5)
非常感谢您的帮助。
问题出在这里:
if int(level)==1:
level1_scores.append(int(score))
players_TS.setdefault(score,[]).append(player)
假设score == "20"
。您正在将 integer 20
添加到 level1_scores
,但使用 string "20"
作为键players_TS
。然后,当你到达这些行时
H_L1=max(level1_scores)
P_L1=players_TS[H_L1]
H_L1
是整数值20
,但players_TS
中的所有键都是字符串,如"20"
。由于 20 != "20"
,KeyError
个结果。
您可能希望 score
(就此而言 level
)始终是一个整数,因此在解析后立即转换一次,然后使用 score
就像循环的其余部分一样。
for line in PS3:
lines = line.split(",")
player = lines[0]
level = int(lines[1])
score = int(lines[2])
with open("scoreboard_errorlog.text","w") as errors:
if score > 20:
errors.write(score)
if level > 5:
errors.write(level)
if level == 1:
level1_scores.append(score)
players_TS.setdefault(score,[]).append(player)
elif level == 2:
level2_scores.append(score)
players_T2.setdefault(score,[]).append(player)
elif level == 3:
level3_scores.append(score)
players_T3.setdefault(score,[]).append(player)
elif level == 4:
level4_scores.append(score)
players_T4.setdefault(score,[]).append(player)
elif level == 5:
level5_scores.append(score)
players_T5.setdefault(score,[]).append(player)
H_L1 = max(level1_scores)
P_L1 = players_TS[H_L1]
H_L2 = max(level2_scores)
P_L2 = players_T2[H_L2]
H_L3 = max(level3_scores)
P_L3 = players_T3[H_L3]
H_L4 = max(level4_scores)
P_L4 = players_T4[H_L4]
H_L5 = max(level5_scores)
P_L5 = players_T5[H_L5]
但是,您还应该使用 dict
s 来存储大量此类数据,而不是单独命名的变量。
level_scores = {level: [] for level in range(1,6)}
players = {}
for line in PS3:
lines = line.split(",")
player = lines[0]
level = int(lines[1])
score = int(lines[2])
# Use append mode, or you overwrite the file each time through the loop
with open("scoreboard_errorlog.text", "a") as errors:
if score > 20:
errors.write(score)
if level > 5:
errors.write(level)
continue
level_scores[level].append(score)
players[level].setdefault(score,[]).append(player)
H = {}
P = {}
for level in range(1,6):
H[level] = max(level_scores[level])
P[level] = players[level][H[level]]
我在 python 中编写了一个程序,它应该 return 每个级别得分最高的玩家,但是它在第 69 行保持 returning "KeyError: 20" ( P_L1=players_TS[H_L1] ),我不知道如何解决这个问题。在我的代码中,我打开一个名为 "playerScores.txt" 的文本文件,其格式如下:
月亮,3,15
StarPlayer,2,18
艾莉,5,9
等等
这是我的代码:
print("The highest scorers for each leve are:\n")
PS3=open("PlayerScores.txt","r").read().split("\n")
level1_scores=[]
players_TS={}
level2_scores=[]
players_T2={}
level3_scores=[]
players_T3={}
level4_scores=[]
players_T4={}
level5_scores=[]
players_T5={}
for line in PS3:
lines=line.split(",")
player=lines[0]
level=lines[1]
score=lines[2]
erros=open("scoreboard_errorlog.text","w")
if int(score)>20:
errors.write(score)
if int(level)>5:
errors.write(level)
if int(level)==1:
level1_scores.append(int(score))
players_TS.setdefault(score,[]).append(player)
if int(level)==2:
level2_scores.append(int(score))
players_T2.setdefault(score,[]).append(player)
if int(level)==3:
level3_scores.append(int(score))
players_T3.setdefault(score,[]).append(player)
if int(level)==4:
level4_scores.append(int(score))
players_T4.setdefault(score,[]).append(player)
if int(level)==5:
level5_scores.append(int(score))
players_T5.setdefault(score,[]).append(player)
H_L1=max(level1_scores)
P_L1=players_TS[H_L1]
H_L2=max(level2_scores)
P_L2=players_T2[H_L2]
H_L3=max(level3_scores)
P_L3=players_T3[H_L3]
H_L4=max(level4_scores)
P_L4=players_T4[H_L4]
H_L5=max(level5_scores)
P_L5=players_T5[H_L5]
print("Level\tPlayer name\tScore\nLevel 1\t",P_L1,"\t",H_L1,"\nLevel 2\t",P_L2,"\t",H_L2,"\nLevel 3\t",P_L3,"\t",H_L3,"\nLevel 4\t",P_L4,"\t",H_L4,"\nLevel 5\t",P_L5,"\t",H_L5)
非常感谢您的帮助。
问题出在这里:
if int(level)==1:
level1_scores.append(int(score))
players_TS.setdefault(score,[]).append(player)
假设score == "20"
。您正在将 integer 20
添加到 level1_scores
,但使用 string "20"
作为键players_TS
。然后,当你到达这些行时
H_L1=max(level1_scores)
P_L1=players_TS[H_L1]
H_L1
是整数值20
,但players_TS
中的所有键都是字符串,如"20"
。由于 20 != "20"
,KeyError
个结果。
您可能希望 score
(就此而言 level
)始终是一个整数,因此在解析后立即转换一次,然后使用 score
就像循环的其余部分一样。
for line in PS3:
lines = line.split(",")
player = lines[0]
level = int(lines[1])
score = int(lines[2])
with open("scoreboard_errorlog.text","w") as errors:
if score > 20:
errors.write(score)
if level > 5:
errors.write(level)
if level == 1:
level1_scores.append(score)
players_TS.setdefault(score,[]).append(player)
elif level == 2:
level2_scores.append(score)
players_T2.setdefault(score,[]).append(player)
elif level == 3:
level3_scores.append(score)
players_T3.setdefault(score,[]).append(player)
elif level == 4:
level4_scores.append(score)
players_T4.setdefault(score,[]).append(player)
elif level == 5:
level5_scores.append(score)
players_T5.setdefault(score,[]).append(player)
H_L1 = max(level1_scores)
P_L1 = players_TS[H_L1]
H_L2 = max(level2_scores)
P_L2 = players_T2[H_L2]
H_L3 = max(level3_scores)
P_L3 = players_T3[H_L3]
H_L4 = max(level4_scores)
P_L4 = players_T4[H_L4]
H_L5 = max(level5_scores)
P_L5 = players_T5[H_L5]
但是,您还应该使用 dict
s 来存储大量此类数据,而不是单独命名的变量。
level_scores = {level: [] for level in range(1,6)}
players = {}
for line in PS3:
lines = line.split(",")
player = lines[0]
level = int(lines[1])
score = int(lines[2])
# Use append mode, or you overwrite the file each time through the loop
with open("scoreboard_errorlog.text", "a") as errors:
if score > 20:
errors.write(score)
if level > 5:
errors.write(level)
continue
level_scores[level].append(score)
players[level].setdefault(score,[]).append(player)
H = {}
P = {}
for level in range(1,6):
H[level] = max(level_scores[level])
P[level] = players[level][H[level]]