【问题标题】:How to interpret a string to define a dictionary call?如何解释字符串以定义字典调用?
【发布时间】:2015-12-03 10:07:54
【问题描述】:

我正在尝试将一个字符串传递给一个函数,该字符串将被解释以确定更新字典所需的所需字典调用。

这是我迄今为止的硬编码示例:

import json
from collections import defaultdict

def default_dict():
    return defaultdict(default_dict)

def build_dict():
    d["a"]["b"]["c"]["d"]["e"]["f"].update({})
    d["a"]["b"]["c1"]["d1"].update({})
    return json.dumps(d)

d = default_dict()
print build_dict()

但为了对我有用,我想将字符串传递给 build_dict() 函数。让我们称之为's':

for s in ["a/b/c/d/e/f", "a/b/c1/d1"]:
    print build_dict(s)

应该打印以下内容(正如我在硬编码的示例中所做的那样:

{
    "a": {
        "b": {
            "c": {
                "d": {
                    "e": {
                        "f": {}
                    }
                }
            },
            "c1": {
                "d1": {}
            }
        }
    }
}

我必须确保在我的硬编码示例中支持多个分支(据我测试)。

我目前正在尝试的事情:

  • 在构建这个问题的中途,我发现了关于 dpath,“用于通过 /slashed/paths ala xpath 访问和搜索字典的 python 库”。它看起来正是我需要的,所以如果我成功解决了这个问题,我会发布这个问题的答案。

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    我为自己的问题找到了解决方案。

    import json
    import dpath.util
    
    def build_dict(viewsDict, viewsList):
        for views in viewsList:
            viewsDict = new_keys(viewsDict, views)
        return viewsDict
    
    def new_keys(viewsDict, views):
        dpath.util.new(viewsDict, views, {})
        return viewsDict
    
    viewsDict = {}
    viewsList = [
        "a/b/c/d/e/f",
        "a/b/c1/d1"
    ]
    
    print json.dumps(build_dict(viewsDict, viewsList), indent=4, sort_keys=True)
    

    【讨论】:

      【解决方案2】:

      这会根据路径序列构建一个字典并通过您的测试用例。

      它从上到下构建一个字典,如果缺少新键,则添加一个新键,并在它们存在时更新现有字典。

      def build_dict(string_seq):
          d = {}
          for s in string_seq:
              active_d = d
              parts = s.split("/")
              for p in parts:
                  if p not in active_d:
                      active_d[p] = {}
                  active_d = active_d[p]
          return d
      
      
      expected = {
          "a": {
              "b": {
                  "c": {
                      "d": {
                          "e": {
                              "f": {}
                          }
                      }
                  },
                  "c1": {
                      "d1": {}
                  }
              }
          }
      }
      
      string_seq = ["a/b/c/d/e/f", "a/b/c1/d1"]
      result = build_dict(string_seq)
      assert result == expected
      

      【讨论】:

        猜你喜欢
        • 2016-10-23
        • 2019-05-18
        • 2015-06-13
        • 1970-01-01
        • 1970-01-01
        • 2013-01-25
        • 2015-02-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多