首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >针对嵌套python字典的类Xpath查询

针对嵌套python字典的类Xpath查询
EN

Stack Overflow用户
提问于 2011-09-06 21:01:45
回答 7查看 32.6K关注 0票数 54

有没有办法为嵌套的python字典定义一个XPath类型的查询?

如下所示:

代码语言:javascript
复制
foo = {
  'spam':'eggs',
  'morefoo': {
               'bar':'soap',
               'morebar': {'bacon' : 'foobar'}
              }
   }

print( foo.select("/morefoo/morebar") )

>> {'bacon' : 'foobar'}

我还需要选择嵌套列表;)

这可以使用@jellybean的解决方案轻松完成:

代码语言:javascript
复制
def xpath_get(mydict, path):
    elem = mydict
    try:
        for x in path.strip("/").split("/"):
            try:
                x = int(x)
                elem = elem[x]
            except ValueError:
                elem = elem.get(x)
    except:
        pass

    return elem

foo = {
  'spam':'eggs',
  'morefoo': [{
               'bar':'soap',
               'morebar': {
                           'bacon' : {
                                       'bla':'balbla'
                                     }
                           }
              },
              'bla'
              ]
   }

print xpath_get(foo, "/morefoo/0/morebar/bacon")

编辑2016这个问题和公认的答案都很古老。新的答案可能比原来的答案做得更好。但是,我没有对它们进行测试,所以我不会更改被接受的答案。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-09-06 21:25:54

不是很漂亮,但是你可以使用类似这样的东西

代码语言:javascript
复制
def xpath_get(mydict, path):
    elem = mydict
    try:
        for x in path.strip("/").split("/"):
            elem = elem.get(x)
    except:
        pass

    return elem

当然,这不支持像索引这样的xpath内容。更不用说unutbu指出的/密钥陷阱了。

票数 15
EN

Stack Overflow用户

发布于 2014-09-26 09:34:20

我所能找到的最好的库之一,另外,也是非常活跃地开发的,是一个从boto中提取的项目:JMESPath。它有一个非常强大的语法来做通常需要几页代码才能表达的事情。

下面是一些示例:

代码语言:javascript
复制
search('foo | bar', {"foo": {"bar": "baz"}}) -> "baz"
search('foo[*].bar | [0]', {
    "foo": [{"bar": ["first1", "second1"]},
            {"bar": ["first2", "second2"]}]}) -> ["first1", "second1"]
search('foo | [0]', {"foo": [0, 1, 2]}) -> [0]
票数 22
EN

Stack Overflow用户

发布于 2013-05-12 21:53:53

现在有一种更简单的方法可以做到这一点。

http://github.com/akesterson/dpath-python

代码语言:javascript
复制
$ easy_install dpath
>>> dpath.util.search(YOUR_DICTIONARY, "morefoo/morebar")

..。好了。或者,如果您不喜欢在视图(保留路径的合并字典)中返回结果,则改为生成它们:

代码语言:javascript
复制
$ easy_install dpath
>>> for (path, value) in dpath.util.search(YOUR_DICTIONARY, "morefoo/morebar", yielded=True)

..。完成了。在这种情况下,‘'value’将包含{'bacon':'foobar'}。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7320319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档