Jaki jest najlepszy sposób na rozszerzenie słownika o inny? Na przykład:
>>> a = { "a" : 1, "b" : 2 }
>>> b = { "c" : 3, "d" : 4 }
>>> a
{'a': 1, 'b': 2}
>>> b
{'c': 3, 'd': 4}
Szukam dowolnej operacji, aby uzyskać for
pętlę omijania :
{ "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
Chcę zrobić coś takiego:
a.extend(b) # This does not work
python
dictionary
FerranB
źródło
źródło
Odpowiedzi:
Najnowsza dokumentacja biblioteki standardowej Python
źródło
{"a":2, "b":3}
pomocą dykta,{"b":4, "c":5}
aby dyktować{"a":2, "b":3,"c":5}
? Oczywiście można to wykorzystaćupdate()
, przenosząc różne rzeczy, ale byłoby lepiej, gdyby można było to osiągnąć tylko w jednej linii ...update
po cichu nadpisuje istniejące wpisy. Oznacza to, że wszelkie wartościb
zastępują wartościa
dla nakładających się kluczy.Piękny klejnot w tym zamkniętym pytaniu :
„Sposób onelinera”, który nie zmienia żadnego z dykt wejściowych, jest
Dowiedzieć się, co
**basket_two
(z**
) oznaczają tutaj .W przypadku konfliktu przedmioty z
basket_two
zastąpią te zbasket_one
. W miarę, jak powstają jedno-linijki, jest to dość czytelne i przejrzyste, a ja nie mam żadnych przeciwwskazań do używania go za każdym razem, gdy przydaje się dyktando, które jest mieszanką dwóch innych (każdy czytelnik, który ma problemy ze zrozumieniem, w rzeczywistości będzie bardzo dobrze obsługiwany przez sposób, w jaki zachęca go to do naukidict
i**
formy ;-). Na przykład wykorzystuje takie jak:są dość częstymi zdarzeniami w moim kodzie.
Pierwotnie przesłane przez Alexa Martelli
Uwaga: W Pythonie 3 zadziała to tylko wtedy, gdy każdy klucz w koszyku_dwie jest a
string
.źródło
dict
jest łatwa do znalezienia,**
a nieco trudniejsza (słowo kluczowe to kwargs ). Oto ładne wyjaśnienie: saltycrane.com/blog/2008/01/…basket_one.update(<dict>)
jak sama nazwa mówi, aktualizuje istniejący słownik (lub klonowany).**anotherdict
, muszą być łańcuchami.Czy próbowałeś używać zrozumienia słownika z mapowaniem słownika:
Innym sposobem jest użycie dict (iterable, ** kwarg)
W Pythonie 3.9 możesz dodać dwa dykty za pomocą union | operator
źródło
Dodaje klucze i wartości od b do a , zastępując je, jeśli istnieje już wartość klucza.
źródło
Jak wspomnieli inni,
a.update(b)
dla niektórych dykta
ib
osiągną wynik, o który prosiłeś w swoim pytaniu. Chcę jednak podkreślić, że wiele razy widziałemextend
metodę mapowania / zestaw przedmiotów, które pragną w składnia.extend(b)
,a
„s wartości nie powinny być zastąpione przezb
” s wartości.a.update(b)
nadpisujea
wartości, więc nie jest to dobry wybórextend
.Zauważ, że niektóre języki wywołują tę metodę
defaults
lubinject
, jak można ją traktować, jako sposób na wstrzyknięcie wartości b (które mogą być zestawem wartości domyślnych) do słownika bez nadpisywania wartości, które już mogą istnieć.Oczywiście możesz zauważyć prostą notatkę, która
a.extend(b)
jest prawie taka sama jakb.update(a); a=b
. Aby usunąć zadanie, możesz to zrobić w następujący sposób:Dzięki Tomowi Leysowi za ten sprytny pomysł wykorzystujący konstruktor bez efektów ubocznych
dict
dlaextend
.źródło
Możesz także użyć kolekcji Pythona. Chainmap, która została wprowadzona w Pythonie 3.3.
Ma to kilka możliwych zalet, w zależności od przypadku użycia. Są one wyjaśnione bardziej szczegółowo tutaj , ale dam krótki przegląd:
To głównie sprawia, że jest użyteczny w takich rzeczach, jak słowniki konfiguracji.
źródło
Jeśli potrzebujesz go jako klasy , możesz go rozszerzyć za pomocą dict i użyć metody aktualizacji :
źródło