.replace() 字典中 String 的所有实例的最佳方法
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>>"}
]
}
而且这个结构很可能会被扩展以包含更多带字段的列表。
我希望将出现在我的数据结构中不同字符串中的所有“<>”实例替换为其他用于访问这些字符串所代表的 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 所说(荣誉)
这是一个技巧,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'}]}
在 python 中,我从数据库中收到以下数据结构:
{
"field":"Somestring/somestring.jpg?<<TOKEN>>",
"list": [
{"field": "sometring.html?<<TOKEN>>"},
{"field2": "otherstring.mp4?<<TOKEN>>"}
]
}
而且这个结构很可能会被扩展以包含更多带字段的列表。
我希望将出现在我的数据结构中不同字符串中的所有“<
有没有比循环访问每个字段,检查它是否为字符串,然后 运行: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 所说(荣誉) 这是一个技巧,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'}]}