代码之家  ›  专栏  ›  技术社区  ›  Paul Gwamanda

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

  •  0
  • Paul Gwamanda  · 技术社区  · 6 年前

    我有两个字典,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() } 听写理解,但我撞到了头

    1 回复  |  直到 6 年前
        1
  •  2
  •   abarnert    6 年前

    我来猜猜你想要什么:

    • 这个 d1 钥匙看起来都像 prefix__suffix (前缀后至少有一个下划线,而不是一个下划线)。
    • 对于每一个 d2 如果它等于 prefix 任何 D1 钥匙,换成那个钥匙。
      • 如果它的前缀是multiple 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编写规则之前,您必须能够用英语定义规则。但这很可能是一个听写根本无法处理的事情。

    例如,如果规则是“如果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()}
    

    (这显然有点复杂,效率低得多。)


    另外,如果你的规则与听写的顺序有关,你可能应该退后一步,重新思考你在做什么。字典天生就是无序的。在一些python解释器(cpython 3.6+、pypy 2.7和3.3+,除了那些python版本的早期pypypy版本,等等)中,如果您保持在一定的约束范围内,dict确实会保持其原始的创建/插入顺序,但这真的是您想要依赖的东西吗?如果排序很重要,请使用 OrderedDict ,或者 list ,或其他类型,它们固有的顺序,而不是固有的任意性,但有时是可预测的。