A Python szótár adatstruktúrája elmagyarázva

A Dictionary a Python egyik leggyakrabban használt adatstruktúrája. A szótár rendezetlen elemgyűjtemény, és általában kulcsokat és értékeket tárolunk egy szótárban. Nézzünk meg néhány példát a szótár szokásos használatára.

# 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

Most nézzünk meg néhány visszakeresési módot.

# 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"]

A KeyError elkerülése: Használja a .get funkciót

Abban az esetben, ha az adott kulcs nem létezik a szótárban, a Python a-t dob KeyError. Ennek egyszerű megoldása van. Nézzük meg, hogyan kerülhetjük KeyErrorel a beépített .getfüggvény használatát a szótárakban.

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_))

Sokszor rendben vagyunk, ha alapértelmezett értéket kapunk, amikor a kulcs nem létezik. Például pult építésénél. Van egy jobb módszer az alapértelmezett értékek lekérésére a szótárból, ha hiányoznak kulcsok, nem pedig a szabványra támaszkodva 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

Tehát get(, )ez egy praktikus művelet az adott kulcs alapértelmezett értékének lekéréséhez a szótárból. A probléma ezzel a módszerrel jön, amikor akarunk foglalkozni változékony adatstruktúrák értéknek pl listvagy 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}

Látta a problémát?

Az új setvagy a listnem lesz hozzárendelve a szótár kulcsához. Meg kell rendelni egy új listvagy seta kulcs esetén a hiányzó értéket, majd appendvagy addvolt. Ley megnézi erre a példát.

dict_ = {} dict_[random_key] = dict_.get(random_key, set()) dict_[random_key].add("Hello World!") print(dict_) # {'random': set(['Hello World!'])}. Yay!

A KeyError elkerülése: Használja az defaultdict parancsot

Ez legtöbbször működik. Ennek azonban van egy jobb módja. Több pythonicmódja. Ez defaultdicta beépített dikt osztály alosztálya. Az defaultdictegyszerűen hozzárendeli az alapértelmezett értéket, amelyet hiányzó kulcs esetén adunk meg. Tehát a két lépés:

dict_[random_key] = dict_.get(random_key, set()) dict_[random_key].add("Hello World!")

most egyetlen lépésben kombinálható. Például

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_)

Hivatalos dokumentumok