【问题标题】:KeyError: 2 When using large values [closed]KeyError:2使用大值时[关闭]
【发布时间】:2015-09-19 05:43:15
【问题描述】:

所以我必须编写一个程序来根据植物的高度将 SAMPLE ID NO 排序到一个列表中(高度的升序),我编写了一个代码,它只适用于小值。当我输入较大的值时,它会显示:

Traceback (most recent call last):
  File "C:/Python34/plant_hieght_id.py", line 15, in <module>
  del d[int(w[0])]
KeyError: 2

我的代码可以在:http://pastebin.com/embed_js.php?i=TXQ94tUy

【问题讨论】:

  • 你应该在这里添加代码,而不是链接它。
  • 认为我们会通过阅读您的代码了解您想要做什么的假设是错误的......
  • 您在循环中执行以下操作:d[id]=ht - 您认为在执行退出循环时d 会有多少不同的值?
  • @alfasin:没有人要求你“研究”我的代码做了什么。如果您阅读,我已经在问题中解释了我想用它做什么。循环也将运行 n 次。这就是我给出的范围。它是一个范围为 (0,n) 的 for 循环。 N 是一个输入。

标签: python python-3.x dictionary keyerror


【解决方案1】:

我必须编写一个程序来对植物的 SAMPLE ID NO 进行排序 根据他们的身高成一个列表(身高升序)

因此,如果d 包含 id 到高度的映射,并且您想要获得按照您想要的高度升序排序的 id 序列:

e = sorted(d, key=lambda k: d[k], reverse=True)
  • 遍历字典会遍历键,因此sorted(d)sorted(d.keys()) 相同。

  • 通过指定key=lambda k: d[k],您可以自定义执行比较的方式。这里比较的是值d[k]而不是键

  • 使用reverse=True 是按降序排列的。 (在您的问题文本中,您说升序,但您提供的代码并没有这样做。如果它真的是升序,您只需删除 reverse=True 参数)


您的原始代码的问题在于:

w=list(d.fromkeys(str(q)))

fromkeys 方法接受一个可迭代对象并创建一个新字典,并将值设置为该可迭代对象。

在这种情况下q 是一个数字,假设它是123str(q) 是字符串 "123"。 所以d.fromkeys(str(q)) 是字典{'1': None, '2': None, '3': None }

您将w 设置为键列表。所以w['1', '2', '3']

最后d[int(w[0])] 尝试删除密钥1但代码不能保证此密钥存在!

当您在上一个循环中输入值时,您可能没有插入任何1 键!

从代码中我你想获得最大值并将其删除。

如果你想删除你应该做的最大元素:

key, val = max(d.items(), key=lambda x_y: x_y[1])
del d[key]

这里max在字典中找到具有最大值的(key, value)对,然后将其删除。

【讨论】:

  • 谢谢。我理解我犯的错误。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
  • 2020-11-18
  • 2014-11-25
相关资源
最近更新 更多