Objašnjena struktura podataka Python rječnika

Rječnik je jedna od najčešće korištenih struktura podataka u Pythonu. Rječnik je neuređena zbirka predmeta i obično imamo ključeve i vrijednosti pohranjene u rječniku. Pogledajmo nekoliko primjera kako se rječnik obično koristi.

# 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

Pogledajmo sada neke načine pronalaženja.

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

Izbjegavanje KeyError: koristite funkciju .get

U slučaju da zadani ključ ne postoji u rječniku, Python će baciti a KeyError. Za to postoji jednostavno rješenje. Pogledajmo kako možemo izbjeći KeyErrorupotrebu ugrađene .getfunkcije za rječnike.

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

Puno puta smo u redu uzimajući zadanu vrijednost kada ključ ne postoji. Na primjer, pri gradnji brojača. Postoji bolji način za dobivanje zadanih vrijednosti iz rječnika u slučaju da nedostaju ključevi, a ne oslanjanje na 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

Dakle, ovo get(, )je zgodna operacija za dohvaćanje zadane vrijednosti za bilo koji dati ključ iz rječnika. Problem s ovom metodom dolazi kada se želimo nositi s promjenjivim strukturama podataka kao vrijednostima, npr . listIli 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}

Jeste li vidjeli problem?

Ključu rječnika se ne dodjeljuje novo setili listne. Ključu bismo trebali dodijeliti novi listili a setu slučaju da nedostaje vrijednost, a zatim appendili add. Leyev pogled na primjer za to.

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

Izbjegavanje KeyError: Koristite zadanu presudu

To djeluje većinu vremena. Međutim, postoji bolji način za to. Još pythonicnačin. To defaultdictje podrazred ugrađene klase diktata. defaultdictJednostavno dodjeljuje zadanu vrijednost koju navedete u slučaju ključ nedostaje. Dakle, dva koraka:

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

sada se mogu kombinirati u jedan jedini korak. Za npr

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

Službeni dokumenti