Python "étendre" pour un dictionnaire

Quelle est la meilleure façon d'étendre un dictionnaire avec un autre? Par exemple:

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

je cherche n'importe quelle opération pour obtenir cette boucle for :

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

je voudrais faire quelque chose comme:

a.extend(b)  # This does not work
338
demandé sur S.Lott 2009-02-23 13:59:32

5 réponses

530
répondu Nick Fortescue 2013-03-23 23:17:06

Un beau bijou à c'est une question fermée :

la "voie oneliner", qui ne modifie aucun des dicts d'entrée, est

basket = dict(basket_one, **basket_two)

apprendre ce que **basket_two (le ** ) signifie ici .

en cas de conflit, les éléments de basket_two l'emportent sur ceux de basket_one . En tant que Mono-liners, c'est assez lisible et transparent, et je n'ai pas se méfier de l'utiliser chaque fois qu'un dict qui est un mélange de deux autres vient à portée de main (tout lecteur qui a du mal à le comprendre sera en fait très bien servi par la façon dont cela l'incite à apprendre sur dict et la forme ** ; -). Ainsi, par exemple, utilise comme:

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

sont des événements assez fréquents dans mon code.

soumis à l'origine par Alex Martelli

Note: en Python 3, cela ne fonctionnera que si chaque clé dans basket_two est une string .

148
répondu Tom Leys 2017-05-23 10:31:37
a.update(b)

va ajouter des clés et des valeurs de b à a , en remplaçant s'il y a déjà une valeur pour une clé.

22
répondu vartec 2009-02-23 11:04:22

comme d'autres l'ont mentionné, a.update(b) pour certains dicts a et b permettra d'obtenir le résultat que vous avez demandé dans votre question. Cependant, je tiens à souligner que de nombreuses fois, j'ai vu la extend méthode de cartographie/définir des objets désirent que dans la syntaxe a.extend(b) , a valeurs de l '"ne doit pas être écrasée par b valeurs de S. a.update(b) remplace a 's valeurs, et n'est donc pas un bon choix pour extend .

notez que certaines langues appellent cette méthode defaults ou inject , car elle peut être considérée comme une façon d'injecter les valeurs de b (qui pourraient être un ensemble de valeurs par défaut) dans un dictionnaire sans écraser les valeurs qui pourraient déjà exister.

bien sûr, vous pourriez simplement noter que a.extend(b) est presque le même que b.update(a); a=b . Pour supprimer l'assignation, vous pouvez le faire ainsi:

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)

merci à Tom Leys pour cela une idée intelligente à l'aide d'un des effets secondaires moins dict constructeur extend .

17
répondu eblume 2012-10-02 19:48:15

avez-vous essayé d'utiliser la compréhension du dictionnaire avec la cartographie du dictionnaire:

c = {**a, **b}
# c = { "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
5
répondu Vlad Bezden 2018-07-03 13:47:53