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

时间:2018-06-18 21:12:34

标签: python python-3.x dictionary-comprehension

我有两个词典,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() }字典理解,但我正在碰脑头

1 个答案:

答案 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,或其他一些本来有序的类型,而不是固有的任意但有时可预测。