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 KeyErrorbruge den indbyggede .getfunktion 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. listEller 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 seteller det listtildeles ikke ordbogens nøgle. Vi skal tildele en ny listeller en settil nøglen i tilfælde af manglende værdi og henholdsvis derefter appendeller 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 pythonicmåde. Det defaultdicter en underklasse af den indbyggede dict-klasse. Den defaultdicttildeler 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