在Python中,从嵌套字典中提取值的正确方法是什么?

643ylb08  于 2022-12-21  发布在  Python
关注(0)|答案(2)|浏览(166)

嵌套字典:

nested_dict = {"fruit": {"apple":{"status": "new", "sold": True},
                         "banana": 10,
                         "watermelon": 30},
               "meat": {"red": 39, "white": 13}}

res = nested_dict.get("fruit", {}).get("apple", {}).get("status")
if res:
    print(f"{res = }")

从嵌套字典中提取值是否有更好的实践?

axr492tv

axr492tv1#

我对速度不是很确定,但我个人喜欢引用字典元素,就像访问列表、元组或大多数其他python数据结构的元素一样,例如:

In [24]: res = nested_dict["fruit"]["apple"]["status"]

In [25]: print(res)
new

我还应该注意到,看起来你正在构造一个叫做JSON file的东西,这是一种常见的文件格式,Python有一个很好的模块,即json模块。

cgh8pdjw

cgh8pdjw2#

你问题中的建议很好。
如果你有很多这样的数据,也许值得写一些helper codem来避免重复,或者安装一个3rdy party lib来更容易地处理嵌套数据。
其中一个库是我编写的一个名为“extradict”的项目(它可以用pip install extradict安装),它有一个NestedData类,该类可以包含嵌套的字典和列表,并允许使用键中的点符号访问项,因此在本例中,只需使用["fruit.apple.status"]就可以访问数据,下面是完整的代码片段:

In [1]: nested_dict = {"fruit": {"apple":{"status": "new", "sold": True},
   ...:                          "banana": 10,
   ...:                          "watermelon": 30},
   ...:                "meat": {"red": 39, "white": 13}}

In [2]: from extradict import NestedData

In [3]: nested = NestedData(nested_dict)

In [4]: nested.get("fruit.apple.status")
Out[4]: 'new'
In [5]: nested.get("fruit.mango.status")
<None>
In [7]:

但是请注意,在这个特定的例子中,如果您试图获取一个包含数字的fruit的“status”,而不是另一个可能包含status键的dict,则会得到extradict.NestedData错误。希望这只是示例数据,并且您周围没有这样的异构数据结构。

In [7]: nested_dict.get("fruit", {}).get("banana", {}).get("status")
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
(...)
AttributeError: 'int' object has no attribute 'get'

In [8]: nested.get("fruit.banana.status")
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
(...)
TypeError: 'int' object is not subscriptable

相关问题