【问题标题】:Why does python "(hash).values()" give an error that "(hash).keys() doesn't give?为什么python“(hash).values()”会给出“(hash).keys()没有给出的错误?
【发布时间】:2018-12-12 23:54:54
【问题描述】:

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

它会给我这样的错误

" Traceback(最近一次调用最后一次):

文件“E:\Practise for MYSELF\Python\TEST.py”,第 8 行,在

打印(每个+' '+scores[每个])

KeyError: 'Zack' "

“result.txt”文件的内容是

约翰尼 8.65

胡安 9.12

约瑟夫 8.45

斯泰西 7.81

艾迪恩 8.05

扎克 7.21

亚伦 8.31

请解释一下,为什么会出现这个错误以及如何解决它?

【问题讨论】:

    标签: python


    【解决方案1】:

    字典按键查找值,而不是按值查找键。 scores.keys() 返回字典的键,而 scores.values() 返回值。然后scores[key] 使用键获取值,因此在这种情况下,分数字典没有键Zack。相反,Zack 是一个值。

    【讨论】:

      【解决方案2】:

      当您将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])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-23
        • 1970-01-01
        • 2020-12-24
        • 1970-01-01
        • 2020-04-08
        • 2019-09-13
        • 1970-01-01
        • 2016-10-03
        相关资源
        最近更新 更多