Обяснена структура на данните в речника на Python

Речникът е една от най-използваните структури от данни в Python. Речникът е неподредена колекция от елементи и обикновено имаме ключове и стойности, съхранявани в речник. Нека разгледаме няколко примера за това как обикновено се използва речникът.

# 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

Нека сега разгледаме някои начини за извличане.

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

Избягване на KeyError: Използвайте функцията .get

В случай че дадения ключ не съществува в речника, Python ще хвърли a KeyError. Има просто решение за това. Нека разгледаме как можем да избегнем KeyErrorизползването на вградената .getфункция за речници.

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

Много пъти ни е добре да получим стойност по подразбиране, когато ключът не съществува. Например, когато изграждате брояч. Има по-добър начин да получите стойности по подразбиране от речника в случай на липсващи ключове, вместо да разчитате на стандартни 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

Така че, това get(, )е удобна операция за извличане на стойността по подразбиране за всеки даден ключ от речника. Проблемът с този метод идва, когато искаме да се справим с изменяеми структури от данни като стойности, например listили 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}

Видя ли проблема?

Новото setили listне се присвояват на ключа на речника. Трябва да присвоим нов listили a setна ключа в случай на липсваща стойност и след това appendили addсъответно. Погледнете на Лей пример за това.

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

Избягване на KeyError: Използвайте defaultdict

Това работи през повечето време. Има обаче по-добър начин да направите това. По-голям pythonicначин. Това defaultdictе подклас на вградения клас dict. Най- defaultdictпросто присвоява стойността по подразбиране, че можем да уточни в случай на липсващи ключ. И така, двете стъпки:

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

вече може да се комбинира в една стъпка. За напр

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

Официални документи