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

用Pythonic方法替换Dict键和/或值,python,dictionary,substitution,Python,Dictionary,Substitution,我正在寻找一种“高效”的方法来迭代字典,并替换任何以“var”开头的键或值 例如,如果我有: data = { "user_id": "{{var_user_id}}", "name": "bob", "{{var_key_name}}": 4 } 我有一个变量值的目录: variables = { "user_id": 10, "key_name": "orders_count" } 然后我希望我的最终数据记录如下所示: data = { "

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

例如,如果我有:

data = {
    "user_id": "{{var_user_id}}",
    "name": "bob",
    "{{var_key_name}}": 4
}
我有一个变量值的目录:

variables = {
    "user_id": 10,
    "key_name": "orders_count"
}
然后我希望我的最终数据记录如下所示:

data = {
    "user_id": 10,
    "name": "bob",
    "orders_count": 4
}

直截了当地说:

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'}

这是一个相当手动的算法,但这里有:

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

这会起作用,但如果你不能保证唯一性,那就有点麻烦了,特别是在需要替换键的情况下。

既然你把它当作文本模板语言(如果是,为什么不让它与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)

没有特别有效的方法,您必须遍历所有键和值。到目前为止,您尝试了什么?我不明白
数据
变量
之间的共同联系是什么。如果dicts中有多个条目,则似乎没有任何标识符来匹配。想必你真正的口述不是这样的,因为这里真的没有什么可重复的。这非常有效,正是我想要的。我只需要稍微修改一下:
text=re.sub({{var{(.*?}}}),lambda m:str(variables[m.groups()[0]]),str(data))
(将lambda包装在str()中)