【问题标题】:Python - Return path of all JSON elements that match stringPython - 返回与字符串匹配的所有 JSON 元素的路径
【发布时间】:2016-06-21 15:34:00
【问题描述】:

我正在尝试在 Python 中逻辑遍历 JSON 并返回任何等于值的字符串值的路径。我正在尝试递归遍历它,但是如果多个元素匹配比较,它只会首先返回他:

test_json = {
    "a": {
        "b": {
            "c": {
                "d": "foo"
            }
        }
    },
    "1": {
        "2": {
            "3": "bar"
        }
    },
    "a1" : "foo"
}

def searchDict(d, path):
    for k,v in d.iteritems():
        if isinstance(v, dict):
            path.append(k)
            return searchDict(v, path)
        else:
            if v == "foo":
                path.append(k)
                path.append(v)
                return path

print searchDict(test_json, [])

我希望它能够返回如下内容:

a -> b -> c -> d -> foo
a1 -> foo

但它只遍历第一个子字典:

['a', 'b', 'c', 'd', 'foo']

这可能比我做的要容易,只是在逻辑上解决它有困难。有什么想法吗?

【问题讨论】:

    标签: python json recursion traversal


    【解决方案1】:

    一些观察,也许还有一些提示:

    1. 您希望算法打印所有路径,但您只保留一个列表。因此,您将所有路径添加到相同的数据结构。听起来更像是您想要一个列表列表,并且可能需要一个额外的列表变量。您的选择
    2. 你在一个稍微奇怪的地方打破了循环“return searchDict(v, path)”如果还有更多的路径需要探索,你会在这里错过它们。如果您删除关键字 return,代码的行为会有所不同,我认为您可以从那里解决它。

    祝你好运!

    【讨论】:

      【解决方案2】:

      真是个好问题。实际上,您离自己解决问题还有两步之遥。

      1. 附加到路径变量将导致在所有递归调用中使用相同的变量。使用 path + [k] 将解决这个问题。如果很难尝试使用您的代码并在 searchdict 函数的开头打印出路径
      2. 您正确地使用 for 循环来迭代 json 文件。但是,您也将返回 forcycle 内部,这将停止它并且不会探索其他可能性。打印结果,将其添加到结果字段或使用 python 的生成器获取结果

      查看我修改后的工作代码。尝试对您的代码进行尽可能少的更改,以便于理解。

      test_json = {
          "a": {
              "b": {
                  "c": {
                      "d": "foo"
                  }
              }
          },
          "1": {
              "2": {
                  "3": "bar"
              }
          },
          "a1" : "foo"
      }
      
      def searchDict(d, path):
          for k,v in d.iteritems():
              if isinstance(v, dict):
                  searchDict(v, path + [k])
              else:
                  if v == "foo":
                      print(path + [k] + [v])
      
      
      searchDict(test_json, [])
      

      【讨论】:

      • 啊,是的。我知道这很简单。放弃回报是有道理的。谢谢!
      • 干得好 ;-) 最好的解决方案是使用带有产量的 python 生成器。如果您想成为专业人士,请阅读它;-)
      猜你喜欢
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多