代码之家  ›  专栏  ›  技术社区  ›  cdm

Pythonic替换Dict键和/或值的方法

  •  1
  • cdm  · 技术社区  · 7 年前

    我正在寻找一种“高效”的方法来迭代字典,并替换任何以“var”开头的键或值。

    data = {
        "user_id": "{{var_user_id}}",
        "name": "bob",
        "{{var_key_name}}": 4
    }
    

    我有一个变量值的dict:

    variables = {
        "user_id": 10,
        "key_name": "orders_count"
    }
    

    data = {
        "user_id": 10,
        "name": "bob",
        "orders_count": 4
    }
    
    3 回复  |  直到 7 年前
        1
  •  1
  •   TessellatingHeckler    7 年前

    既然您将其视为文本模板语言(如果是,为什么不使其与string.format(**variable)兼容呢?)使用文本替换:

    import ast
    import re
    
    text = re.sub('{{var_(.*?)}}', lambda m: variables[m.groups()[0]], str(data))    
    data2 = ast.literal_eval(text)
    
    print(data2)
    
        2
  •  1
  •   RomanPerekhrest    7 年前

    以直接的方式:

    result = {}
    for k,v in data.items():
        if '{{var_' in k:     # if `{{var..}}` placeholder is in key
            result[variables[k[6:-2]]] = v
        elif '{{var_' in v:   # if `{{var..}}` placeholder is in value
            result[k] = variables[v[6:-2]]
        else:
            result[k] = v
    
    print(result)
    

    输出:

    {'user_id': 10, 'orders_count': 4, 'name': 'bob'}
    
        3
  •  0
  •   Austin A    7 年前

    这是一个相当手动的算法,但下面是:

    for key, value in data.iteritems():
        if "var" in str(key):
            #iterate through "variables" to find the match
        elif "var" in str(value):
            #iterate through "variables" to find the match
    
        #populate "data" with the key value pair
    

    保证唯一性 尤其是在 钥匙 需要更换。