我正在使用遞回從嵌套的 JSON 中找到一些特定值的樹路徑。例如,在給定的 JSON 上,我試圖找到src元素的完整路徑樹。注意我有 2 個具有相同值的 src 元素,我當前的代碼適用于不同的src值,但是當我的src鍵具有相同的值時,結果不是預期的。
當前的 JSON:
{
"imagepanel": {
"image": [
{
"scaled_image": {
"classes": "w-full",
"aspect_ratios": "frame sm:4:3 xmed:4:3",
"art_directions": [
{
"alt": "River waves",
"src": "path/to/file/53339c03d67e6ee5-lesson-3.jpg",
"type": "jpg",
"media": "(min-width:900.1px)",
"sizes": "50vw",
"intrinsicwidth": "1411",
"intrinsicheight": "1000"
},
{
"alt": "River waves",
"src": "path/to/file/53339c03d67e6ee5-lesson-3.jpg",
"type": "jpg",
"media": "(max-width:900px)",
"sizes": "100vw",
"intrinsicwidth": "0",
"intrinsicheight": "0"
}
]
}
}
],
"title": "<p><span class=\"drop-cap\" drop-cap=\"true\">WHAT TO WATCH</span></p>",
"cta_label": "SEE THE LIST",
"left_image": true
}
}
當前代碼:
import json
import pprint
def breadcrumb_finder(json_dict_or_list, value):
if json_dict_or_list == value:
return [json_dict_or_list]
elif isinstance(json_dict_or_list, dict):
for k, v in json_dict_or_list.items():
child = breadcrumb_finder(v, value)
if child:
return [k] child
elif isinstance(json_dict_or_list, list):
lst = json_dict_or_list
for i in range(len(lst)):
child = breadcrumb_finder(lst[i], value)
if child:
return [str(i)] child
data = r'''{"imagepanel":{"image":[{"scaled_image":{"classes":"w-full","aspect_ratios":"frame sm:4:3 xmed:4:3","art_directions":[{"alt":"River waves","src":"path/to/file/53339c03d67e6ee5-lesson-3.jpg","type":"jpg","media":"(min-width:900.1px)","sizes":"50vw","intrinsicwidth":"1411","intrinsicheight":"1000"},{"alt":"River waves","src":"path/to/file/53339c03d67e6ee5-lesson-3.jpg","type":"jpg","media":"(max-width:900px)","sizes":"100vw","intrinsicwidth":"0","intrinsicheight":"0"}]}}],"title":"<p><span class=\"drop-cap\" drop-cap=\"true\">WHAT TO WATCH</span></p>","cta_label":"SEE THE LIST","left_image":true}}'''
data = json.loads(data)
all_src = ['path/to/file/53339c03d67e6ee5-lesson-3.jpg', 'path/to/file/53339c03d67e6ee5-lesson-3.jpg']
for src in all_src:
nested_path = breadcrumb_finder(data, src)
print(nested_path)
電流輸出:
['imagepanel', 'image', '0', 'scaled_image', 'art_directions', '0', 'src', 'path/to/file/53339c03d67e6ee5-lesson-3.jpg']
['imagepanel', 'image', '0', 'scaled_image', 'art_directions', '0', 'src', 'path/to/file/53339c03d67e6ee5-lesson-3.jpg']
^^^ note index here
預期輸出:
['imagepanel', 'image', '0', 'scaled_image', 'art_directions', '0', 'src', 'path/to/file/53339c03d67e6ee5-lesson-3.jpg']
['imagepanel', 'image', '0', 'scaled_image', 'art_directions', '1', 'src', 'path/to/file/53339c03d67e6ee5-lesson-3.jpg']
^^^ note index here
uj5u.com熱心網友回復:
經過一番除錯后,我注意到問題出在這段代碼中:
elif isinstance(json_dict_or_list, list):
lst = json_dict_or_list
for i in range(len(lst)):
child = breadcrumb_finder(lst[i], value)
if child:
return [str(i)] child
由于您在child陣列不為空時呼叫 return ,因此lst[i]如果滿足條件,它也會忽略之后的所有元素。
因此,我通過使用回溯稍微更改了您的代碼:
import json
import pprint
results = []
def breadcrumb_finder(json_dict_or_list, value, path, result):
if json_dict_or_list == value:
path.append(json_dict_or_list)
result.append(path.copy())
path.pop()
elif isinstance(json_dict_or_list, dict):
for k, v in json_dict_or_list.items():
path.append(k)
child = breadcrumb_finder(v, value, path, result)
path.pop()
elif isinstance(json_dict_or_list, list):
lst = json_dict_or_list
for i in range(len(lst)):
path.append(i)
child = breadcrumb_finder(lst[i], value, path, result)
path.pop()
data = r'''{"imagepanel":{"image":[{"scaled_image":{"classes":"w-full","aspect_ratios":"frame sm:4:3 xmed:4:3","art_directions":[{"alt":"River waves","src":"path/to/file/53339c03d67e6ee5-lesson-3.jpg","type":"jpg","media":"(min-width:900.1px)","sizes":"50vw","intrinsicwidth":"1411","intrinsicheight":"1000"},{"alt":"River waves","src":"path/to/file/53339c03d67e6ee5-lesson-3.jpg","type":"jpg","media":"(max-width:900px)","sizes":"100vw","intrinsicwidth":"0","intrinsicheight":"0"}]}}],"title":"<p><span class=\"drop-cap\" drop-cap=\"true\">WHAT TO WATCH</span></p>","cta_label":"SEE THE LIST","left_image":true}}'''
data = json.loads(data)
all_src = ['path/to/file/53339c03d67e6ee5-lesson-3.jpg']
for src in all_src:
breadcrumb_finder(data, src, [], results)
print(results)
這將確保串列將一直迭代。結果:
[['imagepanel', 'image', 0, 'scaled_image', 'art_directions', 0, 'src', 'path/to/file/53339c03d67e6ee5-lesson-3.jpg'], ['imagepanel', 'image', 0, 'scaled_image', 'art_directions', 1, 'src', 'path/to/file/53339c03d67e6ee5-lesson-3.jpg']]
編輯:我更新了全域變數,results以免與區域變數混淆
uj5u.com熱心網友回復:
import json
import pprint
def breadcrumb_finder(json_dict_or_list, value):
if json_dict_or_list == value:
return [json_dict_or_list]
elif isinstance(json_dict_or_list, dict):
for k, v in json_dict_or_list.items():
child = breadcrumb_finder(v, value)
if child:
return [k] child
elif isinstance(json_dict_or_list, list):
lst = json_dict_or_list
for i in range(len(lst)):
child = breadcrumb_finder(lst[i], value)
if child:
if child[0] != "src" or str(i) not in found_srcs:
found_srcs.append(str(i))
return [str(i)] child
data = r'''{"imagepanel":{"image":[{"scaled_image":{"classes":"w-full","aspect_ratios":"frame sm:4:3 xmed:4:3","art_directions":[{"alt":"River waves","src":"path/to/file/53339c03d67e6ee5-lesson-3.jpg","type":"jpg","media":"(min-width:900.1px)","sizes":"50vw","intrinsicwidth":"1411","intrinsicheight":"1000"},{"alt":"River waves","src":"path/to/file/53339c03d67e6ee5-lesson-3.jpg","type":"jpg","media":"(max-width:900px)","sizes":"100vw","intrinsicwidth":"0","intrinsicheight":"0"}]}}],"title":"<p><span class=\"drop-cap\" drop-cap=\"true\">WHAT TO WATCH</span></p>","cta_label":"SEE THE LIST","left_image":true}}'''
data = json.loads(data)
all_src = ['path/to/file/53339c03d67e6ee5-lesson-3.jpg', 'path/to/file/53339c03d67e6ee5-lesson-3.jpg']
found_srcs = []
for src in all_src:
nested_path = breadcrumb_finder(data, src)
print(nested_path)
通過存盤找到的 srcs,您可以跳過它們。我發現最簡單的方法是在添加 src 編號之前,您可以像在代碼中一樣完全檢查和跳過該迭代。
輸出:
['imagepanel', 'image', '0', 'scaled_image', 'art_directions', '0', 'src', 'path/to/file/53339c03d67e6ee5-lesson-3.jpg']
['imagepanel', 'image', '0', 'scaled_image', 'art_directions', '1', 'src', 'path/to/file/53339c03d67e6ee5-lesson-3.jpg']
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/312962.html
上一篇:如何為字典中的字符分配數字?
