为什么python“(hash).values()”给出了“(hash).keys()没有给出的错误?

时间:2018-12-12 03:48:25

标签: python

我是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

请解释一下,为什么会发生该错误以及如何解决?

2 个答案:

答案 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])