如何检查 Python 列表/字典中是否存在第二层(嵌套)键?

4
如果我使用的任何术语不正确,请纠正我。
我正在尝试检查python列表/字典中是否存在嵌套键。例如,下面我正在分配一个变量的值,基于该值的键是否存在于Requests' library's .json()方法返回的列表/字典中(从文档中不清楚它到底返回什么)。
这适用于检查jsonassoc列表/字典的第一维中是否存在键。
 #works
 is_oa = jsonassoc[u'is_oa'] if u'is_oa' in jsonassoc else ""

然而,我不确定如何检查第二维度中嵌套的键是否存在。

我尝试过:

#doesn't work:
mendeley = jsonassoc[u'readers'][u'mendeley'] if u'readers'[u'mendeley'] in jsonassoc else "" enter code here
# neither does simply this
mendeley = jsonassoc[u'readers'][u'mendeley'] if u'mendeley' in jsonassoc else ""

我该如何检查列表/字典中的“mendeley”键,它看起来像这样?

readers: {
     mendeley: '1',
     citeulike: '3',
     #etc.
}

提前感谢任何帮助!

2个回答

14

使用字典的.get方法:

d.get('key1',{}).get('key2')

这样做可以绕过密钥检查。


谢谢,我会尝试的! - LazerSharks

2
你需要类似以下这样的内容:
mendeley = jsonassoc[u'readers'][u'mendeley'] if 'readers' in jsonassoc and 'mendeley' in jsonassoc['readers']

或者,你可以使用get函数来指定默认值:

mendeley = jsonassoc.get('readers', {}).get('mendeley', '')

还有一些处理JSON的库,可以让你访问不存在的键,并返回一些空值而不是引发错误。其中safeJSON就是这样一个库,由纽约时报创建。


啊啊啊,我喜欢这个。非常好,符合 Python 三元条件语句的特点。我会试试这个! - LazerSharks
@Gnuey:我认为使用get的解决方案实际上更清晰一些,因为它不涉及键名的重复。但是,如果您经常这样做,您可能想使用库或设置某种通用解决方案来访问不存在的键。 - BrenBarn
好的,我会尝试使用.get。当你说“访问不存在的键”时,你是指什么?你只是指检查它们吗? - LazerSharks
@Gnuey:我的意思是,有一种方法可以让你执行jsonassoc['readers']['mendeley'],即使在您的字典中没有'readers'和/或'mendeley'元素,也会返回一个空值(而不是引发错误)。这就是我链接的safeJSON库所做的。 - BrenBarn
啊,明白了。我会试一下的。谢谢你指引我使用 safeJSON! - LazerSharks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接