[英]Best way to .replace() all instances of a String in a dictionary
在 python 中,我從數據庫收到以下數據結構:
{
"field":"Somestring/somestring.jpg?<<TOKEN>>",
"list": [
{"field": "sometring.html?<<TOKEN>>"},
{"field2": "otherstring.mp4?<<TOKEN>>"}
]
}
並且這種結構很可能會擴展到包含更多帶有字段的列表。
我希望替換出現在整個數據結構中不同字符串中的所有“<<TOKEN>>”實例,並使用其他中使用的驗證令牌來訪問這些字符串表示的 url。
有沒有更好的方法來做到這一點,而不是用循環訪問每個字段,檢查它是否是一個字符串,然后運行: field.replace("<<TOKEN>>", my_token)
這就像一個步行者,進入數據結構的每個級別並應用處理正確類型的治愈方法。 這讓您也可以處理特殊情況或特定數據類型。
var = {
"field":"Somestring/somestring.jpg?<<TOKEN>>",
"list": [
{"field": "sometring.html?<<TOKEN>>"},
{"field2": "otherstring.mp4?<<TOKEN>>"}
]
}
def replacer(obj, val:str):
if isinstance(obj, str):
return obj.replace('<<TOKEN>>', val)
if isinstance(obj, list):
return [replacer(x,val) for x in obj]
if isinstance(obj, dict):
return {k:replacer(x,val) for k,x in obj.items()}
# other cases
#if ...
return obj
replacer(var, 'ciao')
#{'field': 'Somestring/somestring.jpg?ciao',
# 'list': [{'field': 'sometring.html?ciao'},
# {'field2': 'otherstring.mp4?ciao'}]}
正如@Mahrkeenerh (kudos) 所說,這是一個技巧,json-fied 版本也是一個字符串,因此執行單個替換的結果會更好。
序列化 -> 治愈 -> 反序列化
import json
json.loads(json.dumps(var).replace('<<TOKEN>>', 'ciao'))
#{'field': 'Somestring/somestring.jpg?ciao',
# 'list': [{'field': 'sometring.html?ciao'},
# {'field2': 'otherstring.mp4?ciao'}]}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.