I en tidigare handledning lärde vi oss om Python-ordböcker och såg att de betraktas som orörd uppsättningar med a nyckelvärde
par, var nycklar används för att komma åt objekt i stället för positionen, som i exempelvis listor.
I det här snabba tipset ska jag visa dig hur man sammanfogar (sammanfoga) två ordböcker tillsammans.
Låt oss säga att vi har följande två ordböcker:
dict1 = 'bookC': 1, 'bookB': 2, 'bookC': 3 dict2 = 'bookC': 2, 'bookD': 4, 'bookE': 5
Hur kan vi sammanfoga dessa två ordböcker i en enda ordlista? En funktion som vi kan använda i detta avseende är uppdatering ([other])
. Som anges i Python dokumentationen:
Uppdatera ordlistan med tangenten / värdet par från andra, skriva över befintliga nycklar. Lämna tillbaka Ingen
.
uppdatering()
Accepterar antingen ett annat ordlighetsobjekt eller en iterbar av nyckel / värdepar (som tuples eller andra iterables av längd två). Om sökordsargument anges, uppdateras ordlistan med dessa nyckel / värdepar:d.update (röd = 1, blå = 2)
.
Så, för att slå samman ovanstående två ordböcker, kan vi skriva följande:
dict2.update (dict1)
Säg att du skrev följande uttalande för att se resultaten:
skriv ut dict2.update (dict1)
I det här fallet får du Ingen
! Detta beror på att uppdatering()
funktionen returnerar inte en ny ordlista. För att få resultatet av sammanlänkningen skriver du bara följande:
skriv ut dict2
I så fall får du följande utmatning:
'bookA': 1, 'bookB': 2, 'bookC': 3, 'bookD': 4, 'bookE': 5
Vad händer om vi gjorde följande?
dict1.update (dict2) print dict1
I det här fallet får du följande utdata:
'bookA': 1, 'bookB': 2, 'bookC': 2, 'bookD': 4, 'bookE': 5
Observera att i det första fallet, dict2.update (dict1)
, Vi uppdaterar ordlistan dict2
med tangenten / värdet par från dict1
, och skriva över alla befintliga nycklar. Den existerande nyckeln som vi kan märka är 'BookC'
, som kommer att ha värdet 3
i det här fallet, eftersom vi uppdaterar med nyckel / värdepar från dict1
. Detta kommer att vända om i det senare fallet, dict1.update (dict2)
, där vi uppdaterar ordlistan dict1
med nyckel / värdepar från dict2
.
Det finns emellertid ett problem att använda uppdatering()
att slå samman två ordböcker. Problemet ligger i det faktum att den ursprungliga ordlistan kan ändras. Med andra ord, till exempel i det första fallet, dict2.update (dict1)
, den ursprungliga versionen av dict2
kan ändras, och i det senare fallet, dict1.update (dict2)
, den ursprungliga versionen av dict1
kan ändras. Det vill säga att du kan använda uppdatering()
att slå samman två ordböcker om du inte är intresserad av att behålla den ursprungliga versionen av ordlistan du behöver uppdatera. Med den ursprungliga versionen menar jag att behålla värdet på nyckeln.
En annan metod som du kan använda för att slå samman två ordböcker, där du kan utföra en sådan uppgift i ett enda uttryck, är följande:
skriv ut dict (dict2, ** dict1)
Resultatet av detta uttalande är:
'bookA': 1, 'bookB': 2, 'bookC': 3, 'bookD': 4, 'bookE': 5
Således, dict1
overrides dict2
. Om vi vill dict2
Att åsidosätta dict1
, vi skriver:
skriv ut dict (dict1, ** dict2)
Utgången i detta fall skulle vara:
'bookA': 1, 'bookB': 2, 'bookC': 2, 'bookD': 4, 'bookE': 5
Återgå till föregående fråga om att hålla nyckelvärdena, hur kan vi slå samman två ordlistor samtidigt som originalet i varje ordlista hålls?
En lösning för detta kan vara som följer (taget från svaret i denna StackOverflow-tråd):
från itertools importkedja från samlingar import defaultdict dict1 = 'bookA': 1, 'bookB': 2, 'bookC': 3 dict2 = 'bookC': 2, 'bookD': 4, 'bookE': 5 dict3 = defaultdict (list) för k, v i kedjan (dict1.items (), dict2.items ()): dict3 [k] .append (v) för k, v i dict3.items (): print v)
Utgången i detta fall kommer att vara:
('bookA', [1]) ('bookB', [2]) ('bookC', [3, 2]) ('bookD', [4])
Så som du kan se från det här snabba tipset är det mycket lätt att slå samman två ordböcker med Python och det blir lite mer komplicerat om vi vill behålla värdena på samma nyckel i varje ordbok.
Lär dig Python med vår kompletta handledning för pythonhandledning, oavsett om du bara har börjat eller du är en erfaren kodare som vill lära dig nya färdigheter.