Python - Return 匹配字符串的所有 JSON 元素的路径
Python - Return path of all JSON elements that match string
我试图从逻辑上遍历 Python 中的 JSON 和 return 等于某个值的任何字符串值的路径。我试图递归遍历它,但如果多个元素匹配比较,它只会 returns 他第一个:
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, [])
我希望它能够 return 类似于:
a -> b -> c -> d -> foo
a1 -> foo
但是它只遍历第一个子词典:
['a', 'b', 'c', 'd', 'foo']
这可能比我做的要容易,只是在逻辑上无法解决它。有什么想法吗?
一些观察,也许还有提示:
- 您希望您的算法打印所有路径,但您只保留一个列表。因此,您将所有路径添加到同一数据结构中。听起来更像是你想要一个列表列表,也许还有一个你传递的额外列表变量。您的选择
- 你在一个有点奇怪的地方打破了循环"return searchDict(v, path)"如果有更多的路径需要探索,你会在这里错过它们。如果您删除关键字 return,代码的行为将有所不同,我认为您可以从那里解决它。
祝你好运!
好问题。其实离自己解决还差一点点。
- 附加到路径变量将导致在所有递归调用中使用相同的变量。使用 path + [k] 将解决这个问题。如果很难尝试使用您的代码并在 searchdict 函数的开头打印出路径
- 您正确地使用 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 中的 JSON 和 return 等于某个值的任何字符串值的路径。我试图递归遍历它,但如果多个元素匹配比较,它只会 returns 他第一个:
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, [])
我希望它能够 return 类似于:
a -> b -> c -> d -> foo
a1 -> foo
但是它只遍历第一个子词典:
['a', 'b', 'c', 'd', 'foo']
这可能比我做的要容易,只是在逻辑上无法解决它。有什么想法吗?
一些观察,也许还有提示:
- 您希望您的算法打印所有路径,但您只保留一个列表。因此,您将所有路径添加到同一数据结构中。听起来更像是你想要一个列表列表,也许还有一个你传递的额外列表变量。您的选择
- 你在一个有点奇怪的地方打破了循环"return searchDict(v, path)"如果有更多的路径需要探索,你会在这里错过它们。如果您删除关键字 return,代码的行为将有所不同,我认为您可以从那里解决它。
祝你好运!
好问题。其实离自己解决还差一点点。
- 附加到路径变量将导致在所有递归调用中使用相同的变量。使用 path + [k] 将解决这个问题。如果很难尝试使用您的代码并在 searchdict 函数的开头打印出路径
- 您正确地使用 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, [])