【问题标题】:Reading from Python dict if key might not be present如果键可能不存在,则从 Python dict 读取
【发布时间】:2011-01-16 20:26:29
【问题描述】:

我对 Python 和解析数据非常陌生。

我可以将外部 JSON 提要拉入 Python 字典并迭代字典。

for r in results:
     print r['key_name']

当我浏览返回的结果时,当键没有值时出现错误(记录可能并不总是存在值)。如果我打印结果,它会显示为

'key_name': None, 'next_key':.................

我的代码因错误而中断。如何控制没有值的键?

任何帮助将不胜感激!

布洛克

【问题讨论】:

    标签: python json


    【解决方案1】:

    首选方式(如果适用):

    for r in results:
         print r.get('key_name')
    

    如果key_name 不是字典中的键,这将简单地打印None。您也可以有不同的默认值,只需将其作为第二个参数传递:

    for r in results:
         print r.get('key_name', 'Missing: key_name')
    

    如果你想做一些不同于使用默认值的事情(比如,当键不存在时完全跳过打印),那么你需要更多的结构,即:

    for r in results:
        if 'key_name' in r:
            print r['key_name']
    

    for r in results:
        try: print r['key_name']
        except KeyError: pass
    

    第二个可能更快(如果它相当罕见,而不是缺少一个键),但第一个似乎对许多人来说更自然。

    【讨论】:

    • 有没有办法使用 get 获取某个键的子键?
    • 说你有一个字典,{data:{'moredata':'value','evenmoredata':'anothervalue'}},.get 适用于 .get('data'),但是无论如何都可以访问 .get('data')['moredata']
    • @brizz,您刚刚编写的表达式非常适合您给出的示例。对于更复杂的问题,我建议单独问一个问题,而不是试图在评论线程中劫持一个 5 岁的问题!-)
    • 如果密钥不存在,则不会。我在这里发帖的原因是因为它在谷歌搜索结果中显示为最佳答案之一..(我使用'get'的原因是关键可能存在也可能不存在)。如果这不是犹太洁食,我们深表歉意——但搜索是我遇到这个问题的方式,并且知道其他人也会这样做。 python IRC 对 .get() 子键没有很好的答案。如果没有解决方案,我会提出另一个问题。也许只需要在 .get() 中做一个 if?
    • @brizz,发布另一个问题,你会得到答案——在一个非常古老的其他问题的评论线程中隐藏另一个问题的答案将是第二个最糟糕的违规示例SO 礼仪(最糟糕的是在 cmets 中隐藏不同的问题,就像你正在做的那样)。
    【解决方案2】:

    如果 key 可能不存在,有两种直接从 Python dict 读取的方法。例如:

    dicty = {'A': 'hello', 'B': 'world'}

    1. 访问键值对的 Pythonic 方法是:

    value = dicty.get('C', 'default value')

    1. 非pythonic方式:

    value = dicty['C'] if dicty['C'] else 'default value'

    1. 更糟:

    try: value = dicty['C'] except KeyError as ke: value = 'default value'

    【讨论】:

      【解决方案3】:

      如果可能,请使用 simplejson 库来管理 JSON 数据。

      【讨论】:

        【解决方案4】:

        这个线程中的第一个问题是我为什么要编写 Dictor 库,它可以优雅地处理 JSON 回退和 None 值,而不需要 try/except 或 If 块。

        还为您提供其他选项,例如忽略大写/小写,

        看,

        https://github.com/perfecto25/dictor

        【讨论】:

          【解决方案5】:

          使用 has_key() ,这将返回真或假

          【讨论】:

          • d.has_key(k) 现已弃用。你应该在新代码中使用k in d
          【解决方案6】:

          [更新删除粗心的错误]

          你也可以这样做:

          for r in (row for row in results if 'a' in row):
              print r['a']
          

          这使用生成器表达式从“结果”中挑选“行”,其中“行”包含键“a”。

          这是一个小测试脚本:

          results = [{'a':True}, {'b':True}, {'a':True}]
          for r in (row for row in results if 'a' in row): print r['a']
          

          【讨论】:

          • [r.get('key_name') for r in results]
          • @Parand:您在哪个版本的 Python 上进行了测试?您的 for 语句在 Python 2.6 和 3.1 中都绘制了 SYNTAX ERROR
          • 对不起,约翰,这是一个粗心的错误。修复了脚本,现在应该可以在 python 2.5+ 上运行。
          【解决方案7】:

          您可以使用内置函数hasattr

          key='key_name'
          # or loop your keys 
          
          if hasattr(e, key):
            print(e[key])
          else:
            print('No key for %s' % key)
          

          【讨论】:

            猜你喜欢
            • 2012-03-06
            • 1970-01-01
            • 2019-11-07
            • 2018-10-22
            • 2017-07-07
            • 1970-01-01
            • 2022-12-17
            • 2015-06-25
            • 1970-01-01
            相关资源
            最近更新 更多