我经常遇到这个问题,希望有人有一个优雅的解决方案......
x = {'a':1, 'b':{'c':2}}
现在:
x.get('a', None) = 1
x.get('b', None).get('c', None) = 2
怎么样:
x.get('a', None).get('c', None) =
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-5-278862f593e8> in <module>()
----> 1 x.get('a', None).get('c')
AttributeError: 'int' object has no attribute 'get'
是否有一个简单的pythonic单线程来处理这样的情况? (不使用一堆 if 语句)
谢谢!
感谢所有评论/反馈。我正在寻找一个优雅的单行,因为我经常遇到这个问题。显然这是一个玩具示例,其构造只是为了解释问题。我宁愿不使用try / catch块或将代码包装在long if 语句中。谢谢!
答案 0 :(得分:2)
访问嵌套字典键的常用语法是:
>>> x = {'a':1, 'b':{'c':2}}
>>> x['b']['c']
2
>>> x['b']['c'] = 100
>>> x['b']['c']
100
这会在丢失密钥时抛出一个关键错误:
>>> x['b']['d']
...
KeyError: 'd'
你可以用try-catch包装:
>>> try:
... x['b']['d']
... except KeyError as err:
... # do something when no key is present ...
... pass
如果您正在寻找一种“全都不存在的密钥并始终做正确的事情”的解决方案,我想您必须围绕您的特定数据结构编写一些薄的包装。
答案 1 :(得分:1)
这是一个生成器,它将嵌套嵌套值,如果它没有嵌套,则只获取值:
x = {'a':1, 'b':{'c':2}}
def get_value(x, nested_key='c'):
for k, v in x.items():
if isinstance(v, dict):
yield v[nested_key]
else:
yield v
这是一个演示:
>>> for value in get_value(x):
print (value)
2
1
答案 2 :(得分:1)
没有Pythonic单线。任意嵌套需要一些任意代码。 Pythonic方式是要求宽恕意味着尝试捕获块。
想一想,这是有道理的。想象一下,如果它有效,可以调试上面的嵌套get调用。哪一层缺少钥匙?
答案 3 :(得分:0)
你的意思是这样的结构:
try:
x['a']['b'] = 1 # getting or setting values for existing dicts/keys
except:
pass # or do something in case dict does not exists