【问题标题】:How can I split a string and form a multi-level nested dictionary?如何拆分字符串并形成多级嵌套字典?
【发布时间】:2015-07-20 01:35:41
【问题描述】:

我有一个类似的字符串

foo/bar/baz

例如,我也有val=1。有没有一种干净的方法可以将foo/bar/baz 拆分为多维字典,其中字典中的最后一项等于 1。所以它看起来像

{'foo': {'bar': {'baz': 1}}}

【问题讨论】:

    标签: python string dictionary


    【解决方案1】:

    您可以像这样使用reduce 和reversed 函数

    >>> reduce(lambda res, cur: {cur: res}, reversed("foo/bar/baz".split("/")), 1)
    {'foo': {'bar': {'baz': 1}}}
    

    如果你使用的是Python 3.x,那么你需要导入reduce from functools

    >>> from functools import reduce
    >>> reduce(lambda res, cur: {cur: res}, reversed("foo/bar/baz".split("/")), 1)
    {'foo': {'bar': {'baz': 1}}}
    

    这里,reduce 的最后一个参数是起始值。它将从传递的迭代中一个一个地取值,使用结果和当前值调用函数,然后下一次,最后一个结果将是第一个参数,当前值作为第二个参数。当iterable耗尽时,它会返回结果。

    因此,执行将逐步进行,如下所示

    假设func 是 lambda 函数,它会像这样被重复调用

    func(1, "baz")                   => {"baz": 1}
    func({"baz": 1}, "bar")          => {"bar": {"baz": 1}}
    func({"bar": {"baz": 1}}, "foo") => {"foo": {"bar": {"baz": 1}}}
    

    【讨论】:

      【解决方案2】:
      d = 1
      for part in reversed(s.split('/')):
          d = {part: d}
      

      如果这需要扩展以创建类似于目录树的内容,您可能需要基于defaultdict 的解决方案:

      import collections
      
      def tree():
          return collections.defaultdict(tree)
      
      def parsetree(path_strings):
          t = tree()
          for s in path_strings:
              temp = t
              parts = s.split('/')
              for part in parts[:-1]:
                  temp = temp[part]
              temp[parts[-1]] = 1
          return t
      

      演示:

      >>> t = parsetree([
      ...     'foo/bar/baz',
      ...     'foo/bar/bop',
      ...     'foo/spam'
      ... ])
      >>> t['foo']['bar']['baz']
      1
      >>> t['foo']['spam']
      1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-09
        • 2022-01-25
        • 1970-01-01
        • 2020-03-16
        • 2014-02-26
        • 1970-01-01
        相关资源
        最近更新 更多