Dicționarul este una dintre cele mai utilizate structuri de date din Python. Un dicționar este o colecție neordonată de articole și de obicei avem chei și valori stocate într-un dicționar. Să ne uităm la câteva exemple pentru modul în care este utilizat de obicei dicționarul.

# 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

Să vedem acum câteva modalități de recuperare.

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

Evitarea KeyError: Utilizați funcția .get

În cazul în care cheia dată nu există în dicționar, Python va arunca un KeyError. Există o soluție simplă pentru acest lucru. Să vedem cum putem evita KeyError folosind încorporat .get funcție pentru dicționare.

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

De multe ori suntem ok obținând o valoare implicită atunci când cheia nu există. De exemplu, atunci când construiți un blat. Există o modalitate mai bună de a obține valori implicite din dicționar în cazul lipsei cheilor, mai degrabă decât să vă bazați pe 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

Asa ca get(<key>, <defaultval>) este o operațiune la îndemână pentru recuperarea valorii implicite pentru orice cheie dată din dicționar. Problema cu această metodă vine atunci când vrem să ne ocupăm de structuri de date modificabile ca valori de ex list sau 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}

Ai văzut problema?

Noul set sau list nu este atribuit cheii dicționarului. Ar trebui să atribuim un nou list sau a set la cheie în cazul lipsei valorii și apoi append sau add respectiv. Uită-te la un exemplu pentru acest lucru.

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

Evitarea KeyError: utilizați defaultdict

Acest lucru funcționează de cele mai multe ori. Cu toate acestea, există o modalitate mai bună de a face acest lucru. Un altul pythonic cale. defaultdict este o subclasă a clasei dict încorporate. defaultdict pur și simplu atribuie valoarea implicită pe care o specificăm în cazul lipsei unei chei. Deci, cei doi pași:

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

acum pot fi combinate într-un singur pas. De exemplu

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(<class 'list'>, {'random_key': ['Hello World!']}) 
  defaultdict(<class 'set'>, {'random_key': {'Hello World!'}}) 
  defaultdict(<class 'int'>, {'random_key': 1})
"""
print(list_dict_, set_dict_, int_dict_)

Documente oficiale