用 d1 的 dictionary.keys() 更新 d2 的所有 dictionary.keys()

Update all dictionary.keys() of d2 with dictionary.keys() of d1

我有两个字典,d1 和 d2:如何用 d1 的 keys() 更新 d2 的所有 keys()?

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() } 听写理解,但我有点头疼

我来猜猜你想要什么:

  • d1 键看起来都像 prefix__suffix(前缀后至少有一个下划线,不完全是一个)。
  • 对于每个 d2 键,如果它等于任何 d1 键的 prefix,则将其替换为该键。
    • 如果是多个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 根本无法处理的事情。

例如,如果规则是 "if the d2 key is a substring of any d1 key, which could be in any format…" 那么您要么需要构建更复杂的文本搜索数据结构,要么对每个键进行线性搜索:

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()}

(这显然有点复杂,效率也低了很多。)


此外,如果您的规则与命令的顺序有任何关系,您可能应该退后一步,重新考虑您正在做的事情。字典本质上是无序的。在某些 Python 解释器中(CPython 3.6+、PyPy 2.7 和 3.3+,除了那些 Python 版本的非常早期的 PyPy 版本,等等),dicts 确实保持了它们的原始状态creation/insertion 如果您保持在一定的限制范围内,则订购,但这真的是您想要依赖的东西吗?如果排序很重要,请使用 OrderedDictlist 或其他某种固有排序的类型,而不是固有的任意但有时可预测的类型。