在Python中以"foo.bar.baz"的方式访问嵌套dict中的内容-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

在Python中以"foo.bar.baz"的方式访问嵌套dict中的内容

简介:

我们首先举一个多级嵌套的dict的例子,后面也会用这个例子来结合代码说明:

obj = {
  "foo": {
    "bar": {
      "baz": 5
    }
  }
}

javascript中,可以通过lodash的get方法来获取上面的object中形如"foo.bar.baz"的路径所对应的值,比如_.get(obj, "foo.bar.baz")。那么在Python中需要如何操作呢?一个简单的方法是使用functools中的reduce方法来完成:

import functools

path = "foo.bar.baz"
value = functools.reduce(dict.get, path.split('.'), obj)  # value == 5

上面代码采用的是一种非常聪明的方法,巧妙的的通过reduce函数的使用,把一般来说需要通过循环和递归才能解决的问题通过一行代码就解决了

如果在Python 3.8版本之后,我们可以通过list comprehension的walrus operator(就是:=)来做另外一个比较简洁的实现:

path = "foo.bar.baz"
result = obj
__ = [result := dict.get(result, i) for i in path.split('.')]  # result == 5

如果我们需要让上述的函数支持对于不存在的key的容错,那么可以用一个lambda函数来代替dict.get,比如lambda o, k: dict.get(o or {}, key,),这样就可以比较简单在Python直接完成类似于lodash.get的效果了。当然,进一步的增加类型判断还可以让这个函数更加的容错。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章