为了账号安全,请及时绑定邮箱和手机立即绑定

Python-Flatting字典,其中某些键“缺失”

Python-Flatting字典,其中某些键“缺失”

慕斯709654 2021-04-10 15:11:56
有没有更清洁的方法可以做到这一点?我正在检查嵌套字典中的特定键,并将其分配给变量。我将使用它在短时间内使mysql插入。我的主要问题是,如果密钥不存在(有时会发生),我不希望代码失败,我只想将变量发送为空。这段代码似乎可以正常工作,但是我必须做一些类似于20个不同键值的事情,所以我想确保自己以最佳方式进行操作if 'Model' in  ItemAttributes:    Model=ItemAttributes['Model']['value']else:    Model=''
查看完整描述

3 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

dict.get

这是一种解决方案:


Model = ItemAttributes.get('Model', {}).get('value', '')

如果ItemAttributes词典中不存在“模型”键,则返回一个空的词典,并在该词典上使用dict.get('value', '')。当然,如果“模型”键不存在,这将返回一个空字符串。


如果别的

另一种解决方案是添加一个额外的函数调用,并对该函数进行测试以检查密钥是否存在。在这里,我们使用三元语句。这实际上是您现在正在执行的操作,但是将逻辑包装在一个函数中以方便重复访问:


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'])


查看完整回答
反对 回复 2021-04-20
?
慕森卡

TA贡献1806条经验 获得超8个赞

model = ItemAttributes.get('Model', {}).get('value', '')

不知道它是否更好,但是可以!:)


查看完整回答
反对 回复 2021-04-20
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

使用get通常是最好的解决方案。另一个解决方案是捕获KeyError异常:


try: 

    Model=ItemAttributes['Model']['value']

except KeyError:

    Model=''

模型将被设置为'',如果'Model'不是ItemAttributes或者'value'不ItemAttributes['Model']


查看完整回答
反对 回复 2021-04-20
  • 3 回答
  • 0 关注
  • 241 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信