Czy można dodać klucz do słownika Python po jego utworzeniu?
Wydaje się, że nie ma .add()
metody.
python
dictionary
lookup
lfaraone
źródło
źródło
{**mydict, 'new_key': new_val}
.Odpowiedzi:
źródło
.update()
metodą? Który jest lepszy kiedy?d[key]=val
składnia, ponieważ jest krótsza i może obsługiwać dowolny obiekt jako klucz (o ile jest możliwy do skrótu), i ustawia tylko jedną wartość, podczas gdy.update(key1=val1, key2=val2)
jest ładniejsza, jeśli chcesz ustawić wiele wartości jednocześnie, o ile klucze są ciągami (ponieważ kwargi są konwertowane na ciągi).dict.update
mogę również wziąć inny słownik, ale osobiście wolę nie tworzyć nowego słownika w celu aktualizacji innego.$foo[ ] = [ . . . . ]
Aby dodać wiele kluczy jednocześnie, użyj
dict.update()
:W przypadku dodania jednego klucza zaakceptowana odpowiedź ma mniejszy narzut obliczeniowy.
źródło
x[-1] = 44
w-1
wartości jest w końcu też. W każdym razie odpowiedź została zredagowana i jest teraz znacznie lepsza. Aktualizacja za pomocą słownika jest dobra, gdy prawdopodobne jest, że zawiera wiele elementów.Chcę skonsolidować informacje o słownikach Python:
Tworzenie pustego słownika
Tworzenie słownika z wartościami początkowymi
Wstawianie / aktualizowanie pojedynczej wartości
Wstawianie / aktualizowanie wielu wartości
Tworzenie scalonego słownika bez modyfikowania oryginałów
Usuwanie pozycji ze słownika
Sprawdź, czy klucz jest już w słowniku
Iteruj parami w słowniku
Utwórz słownik z dwóch list
Nowy w Python 3.5
Tworzenie scalonego słownika bez modyfikowania oryginałów:
Wykorzystuje to nowy sposób zwany rozpakowywaniem słownika .
Nowy w Python 3.9
Zaktualizuj lub dodaj wartości dla istniejącego słownika
Operator aktualizacja
|=
pracuje teraz dla słowników:Tworzenie scalonego słownika bez modyfikowania oryginałów
Operator scalania
|
pracuje teraz dla słowników:Dodaj więcej!
źródło
Tak, jest to możliwe i ma metodę, która to implementuje, ale nie chcesz jej używać bezpośrednio.
Aby zademonstrować, jak i jak go nie używać, stwórzmy pusty dykt z literałem
{}
:Najlepsza praktyka 1: Notacja indeksu dolnego
Aby zaktualizować ten słownik jednym nowym kluczem i wartością, możesz użyć notacji w indeksie dolnym (patrz Odwzorowania tutaj), która przewiduje przypisanie pozycji:
my_dict
jest teraz:Najlepsza praktyka 2:
update
Metoda - 2 sposobyMożemy również efektywnie aktualizować słownik o wiele wartości, korzystając z tej
update
metody . Możemy niepotrzebnie tworzyćdict
tutaj dodatkowe , więc mamy nadzieję, że naszdict
już został stworzony i pochodzi z lub został wykorzystany w innym celu:my_dict
jest teraz:Innym skutecznym sposobem na wykonanie tego przy użyciu metody aktualizacji są argumenty słów kluczowych, ale ponieważ muszą to być poprawne słowa python, nie możesz mieć spacji lub specjalnych symboli ani zaczynać nazwy od liczby, ale wielu uważa to za bardziej czytelny sposób aby utworzyć klucze do nagrania, a tutaj z pewnością unikamy tworzenia dodatkowego niepotrzebnego
dict
:i
my_dict
jest teraz:Więc teraz omówiliśmy trzy Pythoniczne sposoby aktualizacji
dict
.Metoda magiczna
__setitem__
i dlaczego należy jej unikaćJest inny sposób aktualizacji
dict
, którego nie powinieneś używać, który wykorzystuje tę__setitem__
metodę. Oto przykład, w jaki sposób można użyć tej__setitem__
metody, aby dodać parę klucz-wartość dodict
, oraz demonstrację słabej wydajności jej użycia:Widzimy więc, że używanie notacji w indeksie dolnym jest w rzeczywistości znacznie szybsze niż używanie
__setitem__
. Robienie rzeczy w języku Python, to znaczy używanie języka w sposób, w jaki był przeznaczony, zwykle jest bardziej czytelne i wydajne obliczeniowo.źródło
d.__setitem__
), chociaż wniosek (a zwłaszcza ostatnie zdanie) pozostaje niezmienny. Podniesienie wyszukiwania nazwy metody z pętli skróciło czas do około 1,65 ms; pozostała różnica prawdopodobnie wynika w dużej mierze z nieuniknionego narzutu mechanizmu wywoływania Pythona.źródło
Jeśli chcesz dodać słownik do słownika, możesz to zrobić w ten sposób.
Przykład: dodaj nowy wpis do słownika i słownika podrzędnego
Wynik:
UWAGA: Python wymaga, aby najpierw dodać sub
przed dodaniem wpisów.
źródło
dictionary = {"dictionary_within_a_dictionary": {"sub_dict": {"other" : "dictionary"}}}
(lub jeślidictionary
jest to już dyktatdictionary["dictionary_within_a_dictionary"] = {"sub_dict": {"other" : "dictionary"}}
)Ortodoksyjna składnia jest taka
d[key] = value
, ale jeśli na klawiaturze brakuje kwadratowych klawiszy nawiasów, możesz:W rzeczywistości definiowanie
__getitem__
i__setitem__
metody są sposobem, w jaki możesz sprawić, by twoja klasa obsługiwała składnię nawiasu kwadratowego. Zobacz https://python.developpez.com/cours/DiveIntoPython/php/endiveintopython/object_oriented_framework/special_class_methods.phpźródło
[a for a in my_dict if my_dict.update({'a': 1}) is None]
.{v: k for k, v in my_dict.items() if <some_conditional_check>}
Możesz utworzyć jeden:
Daje:
źródło
To popularne pytanie dotyczy funkcjonalnych metod łączenia słowników
a
ib
.Oto niektóre z bardziej prostych metod (przetestowanych w Pythonie 3) ...
Uwaga: Pierwsza powyższa metoda działa tylko wtedy, gdy klucze w
b
są ciągami znaków.Aby dodać lub zmodyfikować pojedynczy element ,
b
słownik będzie zawierał tylko ten jeden element ...Jest to równoważne z ...
źródło
c = dict( a, **{'d':'dog'} )
byłoby lepiej napisanec = dict(a, d='dog')
, o ile klucze są znane i nie są obliczane.Udawajmy, że chcesz żyć w niezmiennym świecie i NIE chcesz modyfikować oryginału, ale chcesz stworzyć nowy,
dict
który jest wynikiem dodania nowego klucza do oryginału.W Python 3.5+ możesz:
Odpowiednikiem języka Python 2 jest:
Po jednym z tych:
params
jest wciąż równy{'a': 1, 'b': 2}
i
new_params
jest równe{'a': 1, 'b': 2, 'c': 3}
Będą chwile, kiedy nie będziesz chciał modyfikować oryginału (potrzebujesz jedynie wyniku dodania do oryginału). Uważam, że jest to odświeżająca alternatywa dla następujących:
lub
Odniesienie: https://stackoverflow.com/a/2255892/514866
źródło
**
języka Python (wielu nie zna ), to nie będzie oczywiste, co się dzieje. Są chwile, kiedy faworyzujesz mniej funkcjonalne podejście dla lepszej czytelności.Tak wiele odpowiedzi i wciąż wszyscy zapomnieli o dziwnie nazwanych, dziwnie zachowanych, a jednak wciąż przydatnych
dict.setdefault()
To
po prostu robi to:
na przykład
źródło
Jeśli nie dołączasz do dwóch słowników, ale dodajesz nowe pary klucz-wartość do słownika, to użycie notacji w indeksie dolnym wydaje się najlepszym sposobem.
Jeśli jednak chcesz dodać na przykład tysiące nowych par klucz-wartość, powinieneś rozważyć użycie tej
update()
metody.źródło
Myślę, że warto również zwrócić uwagę na
collections
moduł Pythona, który składa się z wielu przydatnych podklas słowników i opakowań, które upraszczają dodawanie i modyfikowanie typów danych w słowniku , w szczególnościdefaultdict
:Jest to szczególnie przydatne, jeśli pracujesz ze słownikami, które zawsze składają się z tych samych typów danych lub struktur, na przykład ze słownikiem list.
Jeśli klucz jeszcze nie istnieje,
defaultdict
przypisuje podaną wartość (w naszym przypadku10
) jako wartość początkową do słownika (często używanego w pętlach). Ta operacja wykonuje zatem dwie czynności: dodaje nowy klucz do słownika (zgodnie z pytaniem) i przypisuje wartość, jeśli klucz jeszcze nie istnieje. W przypadku standardowego słownika spowodowałoby to błąd, ponieważ+=
operacja próbuje uzyskać dostęp do wartości, która jeszcze nie istnieje:Bez użycia
defaultdict
ilość kodu do dodania nowego elementu byłaby znacznie większa i być może wygląda to tak:defaultdict
może być również używany ze złożonymi typami danych, takimi jaklist
iset
:Dodanie elementu automatycznie inicjuje listę.
źródło
Oto inny sposób, którego tu nie widziałem:
Do odtworzenia słownika można użyć konstruktora słownika i niejawnego rozszerzenia. Co ciekawe, metoda ta może być używana do kontrolowania porządku pozycyjnego podczas budowy słownika ( po Python 3.6 ). W rzeczywistości kolejność wstawiania jest gwarantowana dla Python 3.7 i nowszych!
Powyżej używa zrozumienia słownika.
źródło
najpierw sprawdź, czy klucz już istnieje
następnie możesz dodać nowy klucz i wartość
źródło
dodaj klucz słownika, klasa wartości.
źródło