Рубрики
Без рубрики

Структура данных словаря Python объяснила

Автор оригинала: FreeCodeCapm Team.

Словарь является одним из самых используемых структур данных в 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"]

Избегание KeePror: используйте функцию .get

В случае, если данный ключ не существует в словаре, Python бросит 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_))

Много раз мы в порядке, получаем значение по умолчанию, когда ключ не существует. Для E.g. при строительстве счетчика. Есть лучший способ получить значения по умолчанию из словаря в случае отсутствия клавиш, а не полагаться на стандарт Если-ж Отказ

# 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 (, ) это удобная работа для извлечения значения по умолчанию для любого данного ключа из словаря. Проблема с этим методом наступает, когда мы хотим иметь дело с сочеными структурами данных в качестве значений E.G. Список или Установить Отказ

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}

Вы видели проблему?

Новый Установить или Список не назначается на ключ словаря. Мы должны назначить новый Список или Установить к ключу в случае отсутствия значения, а затем Добавить или Добавить соответственно. Отель Ley на примере для этого.

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

Избегание KeePror: используйте по умолчаниюДом

Это работает большую часть времени. Тем не менее, есть лучший способ сделать это. Чем больше Питон способ. defaultdict является подклассом встроенного класса Dict. defaultdict Просто назначает значение по умолчанию, которое мы указываем в случае отсутствия ключа. Итак, два шага:

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

Теперь можно комбинировать в один шаг. Для E.g.

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

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