Pythonic方法访问子目录的密钥

Pythonic方法访问子目录的密钥,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,我经常使用嵌套的dict(例如,从json.loads())创建),有时更深层次的dict会有所不同我想找到一种更优雅、更通俗的方式来访问子目录,而不需要大量嵌套的if语句。 data = some_func() if 'network_data' in data: print "\n## IP Info" if 'hostname' in data['network_data']: print "- Hostname: %s" % data['network_d

我经常使用嵌套的dict(例如,从
json.loads()
)创建),有时更深层次的dict会有所不同我想找到一种更优雅、更通俗的方式来访问子目录,而不需要大量嵌套的
if
语句。

data = some_func()
if 'network_data' in data:
    print "\n## IP Info"
    if 'hostname' in data['network_data']:
        print "- Hostname: %s" % data['network_data']['hostname']
    if 'org' in data['network_data']:
        print "- Org: %s" % data['network_data']['org']
    if 'city' in data['network_data'] and 'country' in data['network_data'] and 'region' in data['network_data']:
        print "- Location: %s, %s, %s" % (data['network_data']['city'],
                                          data['network_data']['country'],
                                          data['network_data']['region'])
(对于其他可能的子指令,重复该
if
语句的不同版本,可能更深入)

我知道dicts的
.get()
函数,但后来我遇到了一些问题,其中一些中级dicts不存在:

ddos = []
for each in vcdb:
    variety = each.get('action').get('hacking').get('variety')
    if 'DoS' in variety:
        ddos.append(each)

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-21-40616b7d85d0> in <module>()
      1 ddos = []
      2 for each in vcdb:
----> 3     variety = each.get('action').get('hacking').get('variety')
      4     if 'DoS' in variety:
      5         ddos.append(each)

AttributeError: 'NoneType' object has no attribute 'get'
ddos=[]
对于vcdb中的每一个:
variation=each.get('action').get('hacking').get('variation'))
如果“DoS”有多种:
ddos.append(每个)
---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
在()
1 ddos=[]
vcdb中各有2个:
---->3 variation=each.get('action').get('hacking').get('variation'))
4如果品种中有“DoS”:
5个ddos。附加(每个)
AttributeError:“非类型”对象没有属性“get”
接受一个
默认值
参数,您可以像这样利用它

variety = each.get('action', {}).get('hacking', {}).get('variety', {})
因此,即使在子dict中找不到后续键,它也会返回一个空dict,而不是失败