首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -扁平化字典,其中一些键“丢失”

问Python -扁平化字典,其中一些键“丢失”
EN

Stack Overflow用户
提问于 2018-07-01 16:44:59
回答 3查看 45关注 0票数 1

有更干净的方法吗?我正在检查嵌套字典中的一个特定键,并将其赋值给一个变量。我很快就会使用它来插入mysql。

我的主要问题是,如果键不存在(有时会发生),我不希望代码失败,我只想将变量发送到空.。

这段代码似乎有效,但我必须做一些类似于大约20个不同的键值的事情,所以我想确定我正在以最好的方式来完成它。

代码语言:javascript
复制
if 'Model' in  ItemAttributes:
    Model=ItemAttributes['Model']['value']
else:
    Model=''
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-01 16:51:07

dict.get

这里有一个解决方案:

代码语言:javascript
复制
Model = ItemAttributes.get('Model', {}).get('value', '')

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

如果/或

另一种解决方案是添加一个额外的函数调用,并让这个函数测试键是否存在。这里我们使用三元语句。这实际上是您现在正在做的事情,但是为了便于重复访问,可以将逻辑封装在一个函数中:

代码语言:javascript
复制
def get_value(d, key1, key2):
    return d[key1][key2] if key1 in d else ''

Model = get_value(ItemAttributes, 'Model', 'value')

捕捉KeyError

一个更通用的解决方案是使用try / except和捕捉KeyError。如果缺少任何键,该函数将返回一个空字符串。否则,reduce + getitem将通过嵌套字典循环访问给定键列表的适当值。

代码语言:javascript
复制
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'])
票数 3
EN

Stack Overflow用户

发布于 2018-07-01 16:49:32

代码语言:javascript
复制
model = ItemAttributes.get('Model', {}).get('value', '')

不确定是否更好,但它有效!:)

票数 2
EN

Stack Overflow用户

发布于 2018-07-01 17:05:44

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

代码语言:javascript
复制
try: 
    Model=ItemAttributes['Model']['value']
except KeyError:
    Model=''

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51125170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档