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

Python 正确地从嵌套字典中获取数据,必须有更好的方法,python,dictionary,Python,Dictionary,我经常遇到这个问题,希望有人有一个优雅的解决方案 x = {'a':1, 'b':{'c':2}} 现在: 那么: x.get('a', None).get('c', None) = --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) &l

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

x = {'a':1, 'b':{'c':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'
x.get('a',无)。get('c',无)=
---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
在()
---->1 x.get('a',无)。get('c'))
AttributeError:“int”对象没有属性“get”
# 有没有一个简单的pythonicone班轮来处理这样的案件?(不使用一堆if语句)

谢谢

#
感谢所有的评论/反馈。我正在寻找一个优雅的单班轮,因为我经常遇到这一点。显然,这是一个玩具示例,它的构建只是为了解释问题。我不希望使用try/catch块,也不希望用长if语句包装代码。谢谢

访问嵌套字典键的常用语法是:

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

如果您正在寻找一种“捕获所有不存在的键并始终做正确的事情”的解决方案,我想您必须围绕特定的数据结构编写一些精简的包装器。

访问嵌套字典键的常用语法是:

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

如果您正在寻找一种“捕获所有不存在的键并始终做正确的事情”的解决方案,我想您必须围绕特定的数据结构编写一些薄型包装。

您是指这样的结构:

try:
    x['a']['b'] = 1  # getting or setting values for existing dicts/keys
except:
    pass  # or do something in case dict does not exists

你的意思是这样的建设:

try:
    x['a']['b'] = 1  # getting or setting values for existing dicts/keys
except:
    pass  # or do something in case dict does not exists

这是一个生成器,如果嵌套,它将获取嵌套值,如果未嵌套,则仅获取值:

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

这是一个生成器,如果嵌套,它将获取嵌套值,如果未嵌套,则仅获取值:

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

没有一条蟒蛇式的一行线。任意嵌套需要一些任意代码。python的方法是请求原谅,意思是一次尝试-抓住障碍


仔细想想,这是有道理的。想象一下调试上面的嵌套get调用是否有效。哪一层缺少键?

没有一个Pythonic单衬里。任意嵌套需要一些任意代码。python的方法是请求原谅,意思是一次尝试-抓住障碍


仔细想想,这是有道理的。想象一下调试上面的嵌套get调用是否有效。哪个层缺少密钥?

您经常尝试使用
get
None
的默认值来分配密钥?真正地你到底想做什么?你的请求,
x.get('a',None)。get('c',None)
不起作用,因为'a'下面没有嵌套的'c'。
。get
,顾名思义,不能用于为dict键赋值
d.get(1,无)
是一个语法错误。此外,
None
首先是多余的,因为如果请求的键不在dict中,
get
方法已经返回
None
(第二个参数是可选的,用于覆盖该行为)。我看到您正在尝试构建数据的“树”,而不仅仅是嵌套dict。是否正确?数据本身是非结构化的,这意味着不是每个节点都有相同数量的分支。您经常尝试使用
get
None
的默认值来分配密钥?真正地你到底想做什么?你的请求,
x.get('a',None)。get('c',None)
不起作用,因为'a'下面没有嵌套的'c'。
。get
,顾名思义,不能用于为dict键赋值
d.get(1,无)
是一个语法错误。此外,
None
首先是多余的,因为如果请求的键不在dict中,
get
方法已经返回
None
(第二个参数是可选的,用于覆盖该行为)。我看到您正在尝试构建数据的“树”,而不仅仅是嵌套dict。是否正确?数据本质上是非结构化的,这意味着不是每个节点都有相同数量的分支。如果没有try/except,它将在x['a']['c']上导致异常。问题是树的节点的分支数不相等。如果没有try/except,它将在x['a']['c']上导致异常问题是树的节点有不相等数量的分支。好的,我们可以得到这样的端点。节点呢?答案可能不在范围内,好吧,我们可以得到这样的端点。节点呢?我同意答案可能不在范围之内,但我不会称之为任意嵌套,因为它需要处理高度非结构化的数据。这篇文章的重点是看看是否有人有一个聪明的解决方案。我同意,但我不会称之为任意嵌套,因为它需要处理高度非结构化的数据。这篇文章的目的是想看看是否有人有一个聪明的解决办法。