首页 文章

Python“扩展”为字典

提问于
浏览
350

哪个是用另一个字典扩展字典的最佳方法?例如:

>>> a = { "a" : 1, "b" : 2 }
>>> b = { "c" : 3, "d" : 4 }
>>> a
{'a': 1, 'b': 2}
>>> b
{'c': 3, 'd': 4}

我正在寻找任何操作来获得这个避免 for 循环:

{ "a" : 1, "b" : 2, "c" : 3, "d" : 4 }

我希望做的事情如下:

a.extend(b)  # This does not work

5 回答

  • 154
  • 552

    this closed question中的一颗美丽宝石:

    “oneliner方式”,既不改变输入词,也是

    basket = dict(basket_one, **basket_two)
    

    了解**basket_two (the **) means here .

    如果发生冲突, basket_two 中的项目将覆盖 basket_one 中的项目 . 作为单行人员,这是非常可读和透明的,并且我没有任何强制反对使用它的任何时候一个混合的两个其他人派上用场(任何难以理解它的读者实际上将得到很好的服务这促使他或她学习 dict** 形式;-) . 因此,例如,使用如下:

    x = mungesomedict(dict(adict, **anotherdict))
    

    在我的代码中经常发生 .

    最初由Alex Martelli提交

    Note: In Python 3, this will only work if every key in basket_two is a string.

  • 12
    a.update(b)
    

    将b中的键和值添加到a,如果已经存在键的值,则覆盖 .

  • 17

    正如其他人所提到的, a.update(b) 对于某些词组 ab 将达到您在问题中要求的结果 . 但是,我想指出很多次我看到映射/设置对象的 extend 方法希望在语法 a.extend(b) 中, a 的值不应该被 b 的值覆盖 . a.update(b) 覆盖 a 's values, and so isn'是 extend 的不错选择 .

    请注意,某些语言将此方法称为 defaultsinject ,因为它可以被视为将b的值(可能是一组默认值)注入字典而不会覆盖可能已存在的值的方法 .

    当然,您可以简单地注意到 a.extend(b)b.update(a); a=b 几乎相同 . 要删除分配,您可以这样做:

    def extend(a,b):
        """Create a new dictionary with a's properties extended by b,
        without overwriting.
    
        >>> extend({'a':1,'b':2},{'b':3,'c':4})
        {'a': 1, 'c': 4, 'b': 2}
        """
        return dict(b,**a)
    

    感谢Tom Leys为 extend 使用无副作用的 dict 构造函数 .

  • 22

    您是否尝试过使用字典映射的字典理解:

    c = {**a, **b}
    # c = { "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
    

相关问题