python - Python - 一些键“丢失”的扁平字典
问题描述
有没有更清洁的方法来做到这一点?我正在检查嵌套字典中的特定键并将其分配给变量。我很快就会用它来做一个 mysql 插入。
我的主要问题是,如果密钥不存在(有时会发生),我不希望代码失败,我只想将变量发送为空。
这段代码似乎可以工作,但我必须做一些类似于大约 20 个不同键值的事情,所以我想确保我以最好的方式做到这一点
if 'Model' in ItemAttributes:
Model=ItemAttributes['Model']['value']
else:
Model=''
解决方案
dict.get
这是一种解决方案:
Model = ItemAttributes.get('Model', {}).get('value', '')
如果字典中不存在“模型”键,则ItemAttributes
返回一个空字典,在其上使用dict.get('value', '')
. 如果“Model”键不存在,这当然会返回一个空字符串。
如果别的
另一种解决方案是添加一个额外的函数调用,并让这个函数测试密钥是否存在。这里我们使用三元语句。这实际上就是您现在正在做的事情,但是将逻辑包装在一个函数中以便于重复访问:
def get_value(d, key1, key2):
return d[key1][key2] if key1 in d else ''
Model = get_value(ItemAttributes, 'Model', 'value')
捕捉 KeyError
更通用的解决方案是使用try
/except
和 catch KeyError
。如果缺少任何键,该函数将返回一个空字符串。否则,reduce
+getitem
将循环遍历嵌套字典以访问给定键列表的适当值。
from functools import reduce
from operator import getitem
def getFromDict(dataDict, mapList):
try:
return reduce(getitem, mapList, dataDict)
except KeyError:
return ''
Model = getFromDict(ItemAttributes, ['Model', 'Value'])
推荐阅读
- c++ - 在 C++ 中定义新的环境变量并在 bat 文件中使用它
- c# - 在使用 efcore 插入 PostgreSQL 数据库时尝试避免 UNIQUE 违规或捕获产生的异常是否更快?
- assembly - 32位程序的汇编指令长度
- javascript - 用于种子数据库的猫鼬脚本挂起
- python - 在 python(flask) 中添加第二个 MySQL 连接
- r - 使用相同的数字在 R 中获得两种不同的方法
- c++ - VSCode C++ 调试器不显示向量项的内容
- java - 如何从 Firestore 的子集合中获取所有文档
- sql - Postgresql 批量更新
- sql-server - MS SSRS 2017 滚动时间框架选项