【问题标题】:Using .get() to get a dictionary value which has multiple keys [duplicate]使用 .get() 获取具有多个键的字典值 [重复]
【发布时间】:2017-07-07 04:12:22
【问题描述】:

从 JSON 数据中,我获得了一个复杂的字典结构。假设我想获取温度等值,我可以通过指定多个键来访问。

},
   "t": {
    "v": -4.1}

temp = float(json_object['data']['iaqi']['t']['v'])

有时这个数据可能没有说“t”,我得到一个 KeyError。所以我想使用字典 .get() 方法来避免这种情况,但它只需要 2 个参数。有没有办法可以使用 4 个键使用此方法?或者我可以尝试另一种解决 KeyError 问题的方法吗?

【问题讨论】:

  • 在这种情况下你希望temp 是什么?

标签: python dictionary


【解决方案1】:

您可以将.get() 应用于't' 之前获得的最后一个元素。想象一下:

a = {'a' : { 'b' : [1, 2]}}
a['a'].get('b') # Returns [1, 2]
a['a'].get('c') # Empty

在你的情况下,你可以使用:

json_object['data']['iaqi'].get('t')

从最后一行开始,如果您尝试访问['v'],您将收到一个AttributeError。您可以按如下方式嵌套它:

json_object['data']['iaqi'].get('t', {}).get('v')
#                                    ^------- will create an empty dict if 't' is not found

【讨论】:

  • 完美!!虽然有什么办法可以让我默认使用空字符串。如果我用“ ”代替 {} 或在 {} 内,我会收到一条错误消息。
【解决方案2】:

你可以这样做:

In [69]: d
Out[69]: {'iaqi': {'t': {'v': -4.1}}}

In [70]: d.get('iaqi').get('t').get('v')
Out[70]: -4.1

In [71]: d.get('iaqi').get('a').get('v')
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-71-9f601d1c1fe4> in <module>()
----> 1 d.get('iaqi').get('a').get('v')

AttributeError: 'NoneType' object has no attribute 'get'

In [72]:

但是!

不存在的键的 nonetype 错误仍然会让您处于相同的情况。

我建议使用 try/except 块:

In [73]: try:
    ...:     print d['iaqi']['t']['v']
    ...: except KeyError:
    ...:     print "I handle this my way"
    ...:
-4.1

In [74]: try:
    ...:     print d['iaqi']['a']['v']
    ...: except KeyError:
    ...:     print "I handle this my way"
    ...:
I handle this my way

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 2019-06-09
    • 2013-01-02
    • 1970-01-01
    • 2014-06-21
    • 2016-10-21
    相关资源
    最近更新 更多