Question
Il existe désormais plusieurs dictionnaires ou mappages, et vous souhaitez les fusionner logiquement en une seule Perform une opération après le mappage, comme rechercher une valeur ou vérifier si certaines clés existent.
Solution
Rejoignez vous disposez de deux dictionnaires comme suit :
a = {'x': 1, 'z': 3 } b = {'y': 2, 'z': 4 }
Supposons maintenant que vous deviez effectuer une opération de recherche dans deux dictionnaires (comme le premier Recherchez à partir de a, si vous ne trouvez pas, recherchez dans b). Une solution très simple consiste à utiliser la classe ChainMap du module collections. Par exemple :
from collections import ChainMap c = ChainMap(a,b) print(c['x']) # Outputs 1 (from a) print(c['y']) # Outputs 2 (from b) print(c['z']) # Outputs 3 (from a)
Discuter
Un ChainMap accepte plusieurs dictionnaires et les transforme logiquement en un seul dictionnaire. Cependant, ces dictionnaires ne sont pas vraiment fusionnés. La classe ChainMap crée simplement une liste en interne pour contenir ces dictionnaires et redéfinit certaines opérations de dictionnaire courantes pour parcourir cette liste. La plupart des opérations de dictionnaire peuvent être utilisées normalement, telles que :
>>> len(c) 3 >>> list(c.keys()) ['x', 'y', 'z'] >>> list(c.values()) [1, 2, 3] >>>
Si une clé en double apparaît, la première occurrence de la valeur mappée sera renvoyée. Par conséquent, c['z'] dans l'exemple de programme renverra toujours la valeur correspondante dans le dictionnaire a, et non la valeur correspondante dans b.
La mise à jour ou la suppression d'un dictionnaire affecte toujours le premier dictionnaire de la liste. Par exemple :
>>> c['z'] = 10 >>> c['w'] = 40 >>> del c['x'] >>> a {'w': 40, 'z': 10} >>> del c['y'] Traceback (most recent call last): ... KeyError: "Key not found in the first mapping: 'y'" >>>
ChainMap est très utile pour les variables de portée (telles que les globales, les locales, etc.) dans les langages de programmation. En fait, il existe des moyens de faciliter les choses :
>>> values = ChainMap() >>> values['x'] = 1 >>> # Add a new mapping >>> values = values.new_child() >>> values['x'] = 2 >>> # Add a new mapping >>> values = values.new_child() >>> values['x'] = 3 >>> values ChainMap({'x': 3}, {'x': 2}, {'x': 1}) >>> values['x'] 3 >>> # Discard last mapping >>> values = values.parents >>> values['x'] 2 >>> # Discard last mapping >>> values = values.parents >>> values['x'] 1 >>> values ChainMap({'x': 1}) >>>
Comme alternative à ChainMap, vous pouvez envisager d'utiliser la méthode update() pour fusionner les deux dictionnaires. Par exemple :
>>> a = {'x': 1, 'z': 3 } >>> b = {'y': 2, 'z': 4 } >>> merged = dict(b) >>> merged.update(a) >>> merged['x'] 1 >>> merged['y'] 2 >>> merged['z'] 3 >>>
Cela fonctionnerait également, mais cela vous obligerait à créer un objet dictionnaire complètement différent (ou à détruire la structure du dictionnaire existante). Dans le même temps, si le dictionnaire d'origine est mis à jour, cette modification ne sera pas reflétée dans le nouveau dictionnaire fusionné. Par exemple :
>>> a['x'] = 13 >>> merged['x'] 1
ChianMap utilise le dictionnaire d'origine et ne crée pas lui-même un nouveau dictionnaire. Il ne produira donc pas les résultats mentionnés ci-dessus, tels que :
>>> a = {'x': 1, 'z': 3 } >>> b = {'y': 2, 'z': 4 } >>> merged = ChainMap(a, b) >>> merged['x'] 1 >>> a['x'] = 42 >>> merged['x'] # Notice change to merged dicts 42 >>>
Tutoriel recommandé : "Tutoriel Python"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!