我有两个词典,d1和d2:如何使用d1的键()更新d2的所有键()?
D1:
{
'btn-orange__p-3': None,
'btn-red__btn-transparent_text-underline': None,
'quadruple__border_border-primary': None
}
D2:
{
'btn-orange': '<a class="btn btn-warning p-3" href="#" role="button">[]</a>',
'btn-red': '<a class="btn btn-danger btn-transparent text-underline" href="#" role="button">[]</a>',
'quadruple': '<div class="col-lg-3 border border-primary">\n{}\n</div>'
}
所需:
D2:
{
'btn-orange__p-3': '<a class="btn btn-warning p-3" href="#" role="button">[]</a>',
'btn-red__btn-transparent_text-underline': '<a class="btn btn-danger btn-transparent text-underline" href="#" role="button">[]</a>',
'quadruple__border_border-primary': '<div class="col-lg-3 border border-primary">\n{}\n</div>'
}
我确信这是一个简单的for k, v in dict
解决方案或{ k: v for k, v in dict.items() }
字典理解,但我正在碰脑头
答案 0 :(得分:2)
我要猜测你想要的东西:
d1
个键看起来都像prefix__suffix
(前缀后面至少有一个下划线,而不是一个)。d2
密钥,如果它等于任何prefix
密钥的d1
,请将其替换为该密钥。
d1
键的前缀,我们可以任意选择一个。d1
键的前缀,请不要管它。如果这是你想要的,首先要做的是从d1.keys()
创建一个键映射字典:
keymap = {key.partition('_')[0]: key for key in d1}
现在,我们可以将其应用于d2中的键:
d3 = {keymap.get(key, key): value for key, value in d2.items()}
如果您想要的是我的猜测的一个小变化 - 例如,如果前缀必须紧跟两个下划线而不是至少一个 - 那么应该很明显如何调整它。
但如果它更加不同......那么,在用Python编写代码之前,你必须能够用英语定义规则。但它可能完全是dict无法处理的事情。
例如,如果规则是“如果d2键是任何d1键的子字符串,可以是任何格式......”那么您将需要构建更复杂的文本搜索数据结构,或者对每个键进行线性搜索:
def mapkey(key):
for k in d1:
if key in k: return k
return key
d3 = {mapkey(key): value for key, value in d2.items()}
(这显然有点复杂,效率也低很多。)
另外,如果你的规则与dicts的顺序有关,你应该退后一步,重新考虑你在做什么。字典本质上是无序的。在一些Python解释器(CPython 3.6 +,PyPy 2.7和3.3+除了那些Python版本的早期PyPy版本等)之外,如果你保持在某些约束条件下,dicts确实会保持原始的创建/插入顺序,但是你想要依靠什么?如果订购很重要,请使用OrderedDict
,或list
,或其他一些本来有序的类型,而不是固有的任意但有时可预测。