您好我的代码中有一本字典词典。
nrec={'bridge': 'xapi1', 'current_operations': {}, 'uuid': '9ae5ca7d-e7d6-7a81-f619-d0ea33efb534', 'tags': [], 'other_config': {'is_guest_installer_network': 'true', 'netmask': '255.255.255.0', 'ip_end': '192.168.128.254', 'ip_begin': '192.168.128.1'}, 'name_label': 'Guest installer network', 'VIFs': ['OpaqueRef:dff106aa-1a94-8384-1c86-862b47c87fcf'], 'allowed_operations': [], 'PIFs': [], 'name_description': 'Network on which guests will get assigned a private local IP address', 'MTU': '1500', 'blobs': {}}
在这里你可以看到这个字典里面还有一个字典'other_config': {'is_guest_installer_network': 'true', 'netmask': '255.255.255.0', 'ip_end': '192.168.128.254', 'ip_begin': '192.168.128.1'}
。
我想查看is_guest_installer_network=="true"
我已经完成nrec["other_config"]["is_guest_installer_network"]== "true"
但问题是某个属性将此other_config属性设置为空值或不同值。然后在这种情况下我的解决方案将抛出异常。所以我想以一种有效的方式做到这一点,如果is_guest_installer_network包含在字典中,并且值(字符串)是真的。
答案 0 :(得分:3)
试试这个:
nrec["other_config"].get('is_guest_installer_network')
如果'is_guest_installer_network'
nrec['other_config']
,它将返回其值
答案 1 :(得分:3)
如果这是一个配置项,您不需要经常访问它(因此您的效率要求会有问题)。配置一次并忘记它(例如设置self.is_guest_installer_network = True
)。
如果您不能忘记它,那将取决于您的词典中存在条目的可能性。如果项目丢失的可能性更大,那么如果您执行以下操作可能会更好。如果项目未命中,则会获得一些快捷方式行为,另一个配置字典仅查找一次(对于存在检查和查找后的值。
def check_guest_installer_network(nrec):
other_config = nrec.get("other_config", None)
return other_config is not None and other_config.get('is_guest_installer_network', False)
如果该项目更有可能存在,那么懒惰的try / except方法可能更适合。由于保存的检查性能,在实际需要处理异常时会超过额外的性能成本。
def check_guest_installer_network(nrec):
try:
return nrec["other_config"]['is_guest_installer_network'] == "true"
except KeyError:
return False
毕竟,如果此检查确实对整体性能产生了重大影响,那么您应该将此变量放在比嵌套字典中更易于访问的位置,例如:将它放入一个全局/类成员变量中,然后享受廉价和简单的检查。
您应该查看cprofile module以确认此查找确实是您的软件的瓶颈,这值得优化。您应该查看timeit module,为您的问题选择性能最佳的解决方案。
答案 2 :(得分:0)
请检查
'other_config' in nrec and 'is_guest_installer_network' in nrec['other_config'] and nrec['other_config']['is_guest_installer_network'] == 'true'
答案 3 :(得分:0)
要检查字典中是否存在密钥,请使用:
if 'key' in dictionary:
# do sth
所以你的代码将是:
if 'other_config' in nrec and 'is_guest_installer_network' in nrec['other_config'] and nrec['other_config']['is_guest_installer_network'] == 'true':
# do sth
此外,如果你想要默认值,如果dict中没有键使用get(key, default)
方法:
nrec.get('other_config', default_value_here)
答案 4 :(得分:0)
一种可能的解决方案是
>>> try:
if nrec["other_config1"]["is_guest_installer_network"] == 'true':
print 'Do Something'
except (KeyError,TypeError):
None #Or do something logical
答案 5 :(得分:0)
避免例外的最佳选择是[{1}},或使用try .. except
内置方法。
dictionary
如果您需要避免异常,那就很好。
答案 6 :(得分:-1)
你有答案
nrec["other_config"]["is_guest_installer_network"]== "true"
可以写成
if nrec.has_key("other_config") and type(nrec["other_config"]) == type({}) and nrec["other_config"].has_key("....") and nrec["other_config"]["is_guest_installer_network"]== "true":
但这有点难看。
或者,如评论中所述
nrec.get("other_config",{}).get("is_guest_installer_network",{}) == "true"
但是这不会处理类型检查。
也许最好做这样的事情
def traverse(_dict, keys):
val = _dict
for key in keys[:-1]:
if key in val and type(val[key]) is dict :
val = val[key]
else:
return None
return val.get(keys[-1],None)