Python Dictionary Datastruktur forklaret
Ordbog er en af de mest anvendte datastrukturer i Python. En ordbog er en uordnet samling af emner, og vi har normalt nøgler og værdier gemt i en ordbog. Lad os se på et par eksempler på, hvordan ordbogen normalt bruges.
# dictionary declaration 1 dict1 = dict() # dictionary declaration 2 dict2 = {} # Add items to the dictionary # The syntax to add and retrieve items is same for either of the two objects we defined above. key = "X" value = "Y" dict1[key] = value # The dictionary doesn't have any specific data-type. # So, the values can be pretty diverse. dict1[key] = dict2
Lad os nu se på nogle måder til hentning.
# Since "X" exists in our dictionary, this will retrieve the value value = dict1[key] # This key doesn't exist in the dictionary. # So, we will get a `KeyError` value = dict1["random"]
Undgå KeyError: Brug .get-funktionen
Hvis den givne nøgle ikke findes i ordbogen, kaster Python et KeyError
. Der er en simpel løsning til dette. Lad os se på, hvordan vi kan undgå at KeyError
bruge den indbyggede .get
funktion til ordbøger.
dict_ = {} # Some random key random_key = "random" # The most basic way of doing this is to check if the key # exists in the dictionary or not and only retrieve if the # key exists. Otherwise not. if random_key in dict_: print(dict_[random_key]) else: print("Key = {} doesn't exist in the dictionary".format(dict_))
Mange gange er det ok, at vi får en standardværdi, når nøglen ikke findes. For eksempel når man bygger en tæller. Der er en bedre måde at få standardværdier fra ordbogen i tilfælde af manglende nøgler i stedet for at stole på standard if-else
.
# Let's say we want to build a frequency counter for items in the following array arr = [1,2,3,1,2,3,4,1,2,1,4,1,2,3,1] freq = {} for item in arr: # Fetch a value of 0 in case the key doesn't exist. Otherwise, fetch the stored value freq[item] = freq.get(item, 0) + 1
Så det get(, )
er en praktisk operation til at hente standardværdien for en given nøgle fra ordbogen. Problemet med denne metode kommer, når vi ønsker at håndtere ændrede datastrukturer som værdier f.eks. list
Eller set
.
dict_ = {} # Some random key random_key = "random" dict_[random_key] = dict_.get(random_key, []).append("Hello World!") print(dict_) # {'random': None} dict_ = {} dict_[random_key] = dict_.get(random_key, set()).add("Hello World!") print(dict_) # {'random': None}
Så du problemet?
Det nye set
eller det list
tildeles ikke ordbogens nøgle. Vi skal tildele en ny list
eller en set
til nøglen i tilfælde af manglende værdi og henholdsvis derefter append
eller derefter add
. Ley ser på et eksempel på dette.
dict_ = {} dict_[random_key] = dict_.get(random_key, set()) dict_[random_key].add("Hello World!") print(dict_) # {'random': set(['Hello World!'])}. Yay!
Undgå KeyError: Brug defaultdict
Dette fungerer for det meste. Der er dog en bedre måde at gøre dette på. En mere pythonic
måde. Det defaultdict
er en underklasse af den indbyggede dict-klasse. Den defaultdict
tildeler simpelthen den standardværdi, som vi angiver i tilfælde af en manglende nøgle. Så de to trin:
dict_[random_key] = dict_.get(random_key, set()) dict_[random_key].add("Hello World!")
kan nu kombineres i et enkelt trin. For f.eks
from collections import defaultdict # Yet another random key random_key = "random_key" # list defaultdict list_dict_ = defaultdict(list) # set defaultdict set_dict_ = defaultdict(set) # integer defaultdict int_dict_ = defaultdict(int) list_dict_[random_key].append("Hello World!") set_dict_[random_key].add("Hello World!") int_dict_[random_key] += 1 """ defaultdict(, {'random_key': ['Hello World!']}) defaultdict(, {'random_key': {'Hello World!'}}) defaultdict(, {'random_key': 1}) """ print(list_dict_, set_dict_, int_dict_)
Officielle Dokumenter