【问题标题】:Python: Dealing with dictionary values that do not exist in a loopPython:处理循环中不存在的字典值
【发布时间】:2014-04-15 22:50:53
【问题描述】:

我是 python 新手,但在 perl 方面有经验。所以我有一本这样的字典

d = { '123' : 'F'
      '124' : 'S'
      '125' : 'F'
    }

我正在为一个包含键值的列表运行循环,但有些可能在我的字典中不存在。当我运行代码时出现错误

print(d[str(row[0])])


KeyError: '126'

Perl 永远不会对我这样做。请帮助一个无知的程序员。

【问题讨论】:

  • 你想让它做什么?

标签: python dictionary hash key keyerror


【解决方案1】:

您可以使用永远不会引发KeyError 异常的dict.get()

如果键在字典中,则返回键的值,否则返回默认值。如果 默认没有给出,它默认为None,所以这个方法永远不会 引发 KeyError。

print(d.get(str(row[0])))

或者,您可以在尝试通过键获取值之前检查键是否在字典中:

key = str(row[0])
if key in d:
    print(d[key])

或者,您也可以捕获KeyError 异常:

key = str(row[0])
try:
    print(d[key])
except KeyError:
    print("Key '{}' not found".format(key)

【讨论】:

  • 但如果你要不厌其烦地去检查,最好只捕获异常。它被认为是良好的 Python 风格:“请求宽恕比获得许可更容易”,格言如是。
  • @alexis 同意,谢谢,将包含在答案中。
  • @alexis 应该说“原谅我” :)
【解决方案2】:

我认为首选的方式是

my_dict.get(key,None)

【讨论】:

    【解决方案3】:

    Python 比 Perl 更面向对象——因此您可以轻松派生自己的 dict 子类,当您尝试访问丢失的键时,它会执行您想要的任何操作。然而,编写难以阅读的代码需要更多的努力,但这是可以做到的。例如:

    class MyDict(dict): __missing__ = lambda _, k: '%s?' % k
    
    d = MyDict((('123', 'F'), ('124', 'S'), ('125', 'F'),))
    
    row = 126, 123, 124
    print(d[str(row[0])])  # -> 126?
    

    【讨论】:

    • 不要这样做:这就是collections.defaultdict 的用途。
    • alexis:不太一样。与defaultdict 不同,这不会将缺失的条目添加到字典中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 2018-02-22
    • 2019-07-16
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    相关资源
    最近更新 更多