Hoe twee Python-woordenboeken samen te voegen

In een vorige tutorial leerden we over Python Dictionaries en zagen dat ze als ongeordende sets worden beschouwd met een sleutel waarde paar, waar sleutels worden gebruikt om items te openen in tegenstelling tot de positie, zoals in lijsten bijvoorbeeld.

In deze snelle tip laat ik je zien hoe je twee woordenboeken samenvoegt (samenvoegt).

De methode Update ()

Laten we zeggen dat we de volgende twee woordenboeken hebben:

dict1 = 'bookA': 1, 'bookB': 2, 'bookC': 3 dict2 = 'bookC': 2, 'bookD': 4, 'bookE': 5

Hoe kunnen we die twee woordenboeken in één woordenboek samenvoegen? Een functie die we in dit opzicht kunnen gebruiken is bijwerken ([other]). Zoals vermeld in de documentatie van Python:

Werk het woordenboek bij met de sleutel / waarde-paren van anders, bestaande sleutels overschrijven. terugkeer Geen.
bijwerken() accepteert een ander woordenboekobject of een iterabele van sleutel / waardeparen (als tuples of andere iterables van lengte twee). Als trefwoordargumenten zijn opgegeven, wordt het woordenboek vervolgens bijgewerkt met die sleutel- / waardeparen: d.update (rood = 1, blauw = 2).

Om de bovenstaande twee woordenboeken samen te voegen, kunnen we het volgende typen:

dict2.update (dict1)

Zeg dat je de volgende verklaring hebt ingetypt om de resultaten te bekijken:

print dict2.update (dict1)

In dit geval krijg je Geen! Dit komt omdat het bijwerken() functie retourneert geen nieuw woordenboek. Voer het volgende in om het resultaat van de aaneenschakeling te krijgen:

print dict2

In dat geval krijgt u de volgende uitvoer:

'bookA': 1, 'bookB': 2, 'bookC': 3, 'bookD': 4, 'bookE': 5

Wat als we het volgende zouden doen?

dict1.update (dict2) print dict1

In dit geval krijgt u de volgende uitvoer:

'bookA': 1, 'bookB': 2, 'bookC': 2, 'bookD': 4, 'bookE': 5

Merk op dat in het eerste geval, dict2.update (dict1), we werken het woordenboek bij Dict2 met de sleutel / waarde-paren van dict1, en het overschrijven van bestaande sleutels. De bestaande sleutel zoals we kunnen opmerken is 'BookC', welke de waarde zal hebben 3 in dit geval, omdat we updaten met de sleutel / waarde-paren van dict1. Dit zal in het laatste geval worden teruggedraaid, dict1.update (Dict2), waar we het woordenboek bijwerken dict1 met sleutel / waarde-paren van Dict2.

Er is echter een probleem bij het gebruik bijwerken() om twee woordenboeken samen te voegen. Het probleem ligt in het feit dat het oorspronkelijke woordenboek kan worden gewijzigd. Met andere woorden, in het eerste geval bijvoorbeeld, dict2.update (dict1), de originele versie van Dict2 kan worden gewijzigd, en in het laatste geval, dict1.update (Dict2), de originele versie van dict1 kan worden gewijzigd. Dat wil zeggen dat je kunt gebruiken bijwerken() om twee woordenboeken samen te voegen als u niet geïnteresseerd bent in het bijhouden van de oorspronkelijke versie van het woordenboek dat u moet bijwerken. In de originele versie bedoel ik het behouden van de waarde van de sleutel.

Twee woordenboeken samenvoegen in één expressie

Een andere methode die u kunt gebruiken om twee woordenboeken samen te voegen, waarbij u een dergelijke taak in een enkele uitdrukking kunt uitvoeren, is als volgt:

print dict (dict2, ** dict1)

De uitvoer van deze verklaring is:

'bookA': 1, 'bookB': 2, 'bookC': 3, 'bookD': 4, 'bookE': 5

Dus, dict1 overschrijvingen Dict2. Als we willen Dict2 overschrijven dict1, wij typen:

print dict (dict1, ** dict2)

De output in dit geval zou zijn:

'bookA': 1, 'bookB': 2, 'bookC': 2, 'bookD': 4, 'bookE': 5

Sleutelwaarden behouden 

Terugkomend op het vorige nummer van het behouden van de sleutelwaarden, hoe kunnen we twee woordenboeken samenvoegen met behoud van de originelen van elk woordenboek?

Een oplossing hiervoor kan als volgt zijn (ontleend aan het antwoord in deze StackOverflow-thread):

from itertools import chain from collections import defaultdict dict1 = 'bookA': 1, 'bookB': 2, 'bookC': 3 dict2 = 'bookC': 2, 'bookD': 4, 'bookE': 5 dict3 = defaultdict (lijst) voor k, v in keten (dict1.items (), dict2.items ()): dict3 [k] .append (v) voor k, v in dict3.items (): print (k, v)

De uitvoer is in dit geval:

('bookA', [1]) ('bookB', [2]) ('bookC', [3, 2]) ('bookD', [4]) ('bookE', [5])

Dus, zoals je kunt zien aan deze snelle tip, is het heel gemakkelijk om twee woordenboeken samen te voegen met Python, en het wordt een beetje ingewikkelder als we de waarden van dezelfde sleutel in elk woordenboek willen behouden.

Leer Python

Leer Python met onze complete python-handleiding, of je nu net begint of dat je een ervaren coder bent die op zoek is naar nieuwe vaardigheden.