从嵌套字典中正确获取数据,必须有更好的方法

时间:2013-12-02 15:36:23

标签: python dictionary

我经常遇到这个问题,希望有人有一个优雅的解决方案......

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 语句中。谢谢!

4 个答案:

答案 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