代码之家  ›  专栏  ›  技术社区  ›  FerranB Tom

Python对字典的“扩展”

  •  361
  • FerranB Tom  · 技术社区  · 17 年前

    在避免使用词典的同时,用另一本词典扩展词典的最佳方法是什么 for 环例如:

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

    结果:

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

    a.extend(b)  # This does not work
    
    5 回复  |  直到 6 年前
        2
  •  214
  •   Community Mohan Dere    9 年前

    美丽的宝石 this closed question :

    改变两个输入命令的“单向方式”是

    basket = dict(basket_one, **basket_two)
    

    学什么 **basket_two (the ** ) means here

    如果发生冲突,则从 basket_two basket_one . 正如一句话所说,这是非常可读和透明的,每当一个由两个其他单词混合而成的dict出现在手边时,我都会毫不犹豫地使用它(事实上,任何理解它有困难的读者都会很好地理解它,因为这会促使他或她学习 dict ** 形式;-)。因此,例如,使用类似于:

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

    在我的代码中经常出现。

    原提交人 Alex Martelli

    注: 在Python3中,只有当basket_two中的每个键都是 string

        3
  •  72
  •   Vlad Bezden    6 年前

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

    另一种方法是使用dict(iterable,**kwarg)

    c = dict(a, **b)
    # c = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
    

    In Python 3.9 you can add two dict using union | operator

    # use the merging operator |
    c = a | b
    # c = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
    
        4
  •  25
  •   vartec    17 年前
    a.update(b)
    

    B A. ,如果已经有键的值,则覆盖。

        5
  •  18
  •   eblume    13 年前

    正如其他人提到的那样, a.update(b) 为了一些口述 a b 将实现您在问题中要求的结果。然而,我想指出的是,我多次看到 extend 映射/设置语法中所需对象的方法 a.extend(b) , A. 的值不应被覆盖 B a、 更新(b) 覆盖 的价值观,因此不是一个好的选择 延伸 .

    defaults inject ,因为它可以被认为是一种将b的值(可能是一组默认值)注入到字典中而不覆盖可能已经存在的值的方法。

    a、 延长(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的聪明创意,使用的副作用更少 dict 建造师 延伸

        6
  •  2
  •   Ivo Merchiers kakajan    7 年前

    您还可以使用python的 collections.Chainmap 它是在python 3.3中引入的。

    from collections import Chainmap
    c = Chainmap(a, b)
    c['a'] # returns 1
    

    这有一些可能的优点,具体取决于您的用例。对它们进行了更详细的解释 here ,但我将简要概述:

    • 链图只使用字典的视图,所以实际上不会复制任何数据。这将导致更快的链接(但较慢的查找)
    • 实际上不会覆盖任何键,因此,如果需要,您可以知道数据是来自a还是b。

    这主要使它对配置字典之类的东西有用。

        7
  •  0
  •   Željko Å ević    6 年前

    以防你需要它作为一个 ,您可以使用 字典 和使用 使现代化 方法:

    Class a(dict):
      # some stuff
      self.update(b)