Mam pusty słownik. Nazwa: dict_x
ma mieć klucze, których wartości są listami.
Z oddzielnej iteracji otrzymuję klucz (np .:) key_123
i element (krotkę) do umieszczenia na liście dict_x
wartości key_123
.
Jeśli ten klucz już istnieje, chcę dołączyć ten element. Jeśli ten klucz nie istnieje, chcę go utworzyć z pustą listą, a następnie dołączyć do niego lub po prostu utworzyć go z krotką.
W przyszłości, gdy ponownie pojawi się ten klucz, ponieważ istnieje, chcę, aby wartość została ponownie dodana.
Mój kod składa się z tego:
Uzyskaj klucz i wartość.
Sprawdź, czy klucz NIE istnieje w
dict_x
.a jeśli nie, utwórz go:
dict_x[key] == []
Potem:
dict_x[key].append(value)
Czy to jest sposób na zrobienie tego? Czy mam spróbować użyć try/except
klocków?
dict_x[key] = [some_value] if not dict_x.has_key(key) else dict_x[key] + [some_value]
ale ta odpowiedź sugeruje znacznie lepszy sposób. W rzeczywistości jestset()
to argument i pozwala na użycieadd()
metody ...Oto różne sposoby, aby to zrobić, aby porównać jego wygląd i wybrać to, co lubisz. Zamówiłem je w sposób, który moim zdaniem jest najbardziej „pytoniczny” , i skomentowałem zalety i wady, które mogą nie być oczywiste na pierwszy rzut oka:
Używając
collections.defaultdict
:Plusy: Prawdopodobnie najlepsza wydajność. Wady: Niedostępne w Pythonie 2.4.x.
Używając
dict().setdefault()
:Wady: nieefektywne tworzenie nieużywanych
list()
s.Używając
try ... except
:Lub:
źródło
.setdefault()
tworzyło niepotrzebne słowniki. Myślę , że tworzę niepotrzebnelist
s (tj.[]
) W drugim argumencie,.setdefault()
który nigdy nie jest używany, jeślikey
już istnieje. Mógłbym użyćdict.setdefault()
(na korzyść wydajnego haszowania klucza) i użyć zmiennej do ponownego użycia nieużywanychlist
s, ale dodaje to kilka dodatkowych wierszy kodu..setdefault
tworzy regularnydict
gdzie klucz nieobecny look-up spowodujeKeyError
wyciągnięciecollections.defaultdict(list)
tworzydict
gdzie nieobecne kluczowych wyszukiwań wstawi pustalist
- myślę, że należy wybrać na podstawie których zachowanie chceszMożesz użyć do tego domyślnego słowa .
Jest to nieco bardziej wydajne niż wtedy
setdefault
, gdy nie tworzysz nowych list, których nie używasz. Każde wywołanie spowodujesetdefault
utworzenie nowej listy, nawet jeśli pozycja już istnieje w słowniku.źródło
Możesz użyć defaultdict w
collections
.Przykład z doc:
źródło
źródło
dict.get
).