我是python的初学者。仍在学习基础知识。我尝试下面的代码,它给了我预期的结果。
result_f=open("results.txt")
scores={}
for line in result_f:
(name, score)=line.split()
scores[score]=name
result_f.close()
for each in sorted(scores.keys(), reverse=True):
print(each+' '+scores[each])
但是如果我使用
scores.values()
代替
scores.keys()
它会给我这样的错误
“追溯(最近一次通话):
文件
中的第8行,文件“ E:\ MYSELF \ Python \ TEST.py的实践”。print(每个+''+分数[每个])
KeyError:'Zack'“
“ result.txt”文件的内容是
约翰尼8.65
胡安9.12
约瑟夫8.45
史黛西7.81
爱登8.05
Zack 7.21
亚伦8.31
请解释一下,为什么会发生该错误以及如何解决?
答案 0 :(得分:2)
字典按键查找值,而不是按值查找键。 scores.keys()
返回字典的键,而scores.values()
返回值。然后scores[key]
正在使用键获取值,因此在这种情况下,scores词典没有键Zack
。相反,Zack
是一个值。
答案 1 :(得分:0)
当您将scores.keys()
切换为scores.values()
时,变量each
不再像以前那样存储分数(数字)。相反,它存储的名称(字符串)不能在[]
运算符内使用,以在数组中查找值。
您可能想做的是让循环遍历每个可能的名称并找到与之相关的分数。但是,为了做到这一点,您无需更改循环,而只需更改数组。
为此,您唯一需要更改的行是scores[score]=name
。尝试将其更改为scores[name]=score
。现在,这会将名称存储为键,将分数存储为值。如果您运行下面的代码,您将看到,比起先得分然后再命名,您将先命名然后再得分,就像我假设的那样。这与您发布的输入文件的格式匹配。
result_f=open("results.txt")
scores={}
for line in result_f:
(name, score)=line.split()
scores[name]=score
result_f.close()
for each in sorted(scores.keys(), reverse=True):
print(each+' '+scores[each])