从可能不存在键的Python字典中读取

39 投票
8 回答
71311 浏览
提问于 2025-04-15 19:17

我刚开始学习Python和数据解析。

我可以把外部的JSON数据拉取到一个Python字典里,然后遍历这个字典。

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

当我查看返回的结果时,如果某个键没有值(有些记录可能没有值),就会出现错误。如果我打印结果,它显示为

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

我的代码在出错的地方就停止了。有什么办法可以处理键没有值的情况吗?

任何帮助都非常感谢!

布洛克

8 个回答

1

如果可以的话,建议使用simplejson这个库来处理JSON数据。

7

在Python中,如果你想从字典中读取数据,但不确定某个键是否存在,有两种简单的方法。比如说:

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

  1. 第一种是比较推荐的方式:

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

这里用的是`get`方法,它会尝试找到键'C'的值。如果找不到,就会返回你指定的默认值,比如这里的'default value'。

  1. 第二种方式就不太推荐了:

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

这种写法试图直接访问键'C',如果它存在且有值,就用它的值;如果没有值,就返回默认值。这种方式有点风险,因为如果键'C'根本不存在,程序会报错。

  1. 还有一种更糟糕的方式:

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

这种方法使用了`try`和`except`,它会尝试获取键'C'的值。如果找不到这个键,就会捕捉到错误,然后返回默认值。这种方式虽然能处理错误,但写起来比较麻烦,不够简洁。

95

当适用时,推荐的方式是:

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

第二种方式在键缺失的情况比较少见时可能会更快,但第一种方式对很多人来说看起来更自然。

撰写回答