簡體   English   中英

.replace() 字典中字符串的所有實例的最佳方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM