如果密钥可能不存在,则从Python dict读取

时间:2010-02-15 02:31:47

标签: python json

我是Python和解析数据的新手。

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

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

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

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

我的代码打破了错误。如何控制没有值的键?

任何帮助将不胜感激!

布洛克

7 个答案:

答案 0 :(得分:74)

首选方式,如果适用:

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

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

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

第二个可以更快(如果它比缺少的钥匙少得多),但第一个似乎对许多人来说更自然。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

  1. 访问键值对的pythonic方法是:
  2. value = dicty.get('C', 'default value')

    1. 非pythonic方式:
    2. value = dicty['C'] if dicty['C'] else 'default value'

      1. 更糟糕的是:
      2. try: value = dicty['C'] except KeyError as ke: value = 'default value'

答案 3 :(得分:1)

该线程中的最初问题是为什么我编写了Dictor库,它可以优雅地处理JSON回退和None值,而无需try / except或If块。

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

看到,

https://github.com/perfecto25/dictor

答案 4 :(得分:0)

使用has_key(),这将返回true或false

答案 5 :(得分:0)

[更新以消除粗心错误]

您也可以这样做:

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']

答案 6 :(得分:0)

您可以使用内置函数hasattr

key='key_name'
# or loop your keys 

if hasattr(e, key):
  print(e[key])
else:
  print('No key for %s' % key)