Наряду со списками и кортежами Python имеет еще одну встроенную структуру данных, которая называется словарь (dictionary). В ряде языков программирования есть похожие структуры (словарь в C#, ассоциативный массив в PHP).

Как и список, словарь хранит коллекцию элементов. Каждый элемент в словаре имеет уникальный ключ, с которым ассоциировано некоторое значение.

Определение словаря имеет следующий синтаксис:

dictionary = { ключ1:значение1, ключ2:значение2, ....}

Определим пару словарей:

users = {1: "Tom", 2: "Bob", 3: "Bill"}
 
elements = {"Au": "Золото", "Fe": "Железо", "H": "Водород", "O": "Кислород"}

В словаре users в качестве ключей используются числа, а в качестве значений — строки. В словаре element в качестве ключей используются строки.

Но необязательно ключи и строки должны быть однотипными. Они могу представлять разные типы:

objects = {1: "Tom", "2": True, 3: 100.6}

Мы можем также вообще определить пустой словарь без элементов:

objects = {}

или так:

objects = dict()

Преобразование из списка в словарь

Несмотря на то, что словарь и список — непохожие по структуре типы, но тем не менее существует возможности для отдельных видов списков преобразования их в словарь с помощью встроенной функции dict(). Для этого список должен хранить набор вложенных списков. Каждый вложенный список должен состоять из двух элементов — при конвертации в словарь первый элемент станет ключом, а второй — значением:

users_list = [
    ["+111123455", "Tom"],
    ["+384767557", "Bob"],
    ["+958758767", "Alice"]
]
users_dict = dict(users_list)
print(users_dict)  # {"+111123455": "Tom", "+384767557": "Bob", "+958758767": "Alice"}

Подобным образом можно преобразовать в словарь двухмерные кортежи, которые в свою очередь содержать кортежи из двух элементов:

users_tuple = (
    ("+111123455", "Tom"),
    ("+384767557", "Bob"),
    ("+958758767", "Alice")
)
users_dict = dict(users_tuple)
print(users_dict)

Получение и изменение элементов

Для доступа к элементам словаря необходимо использовать ключ:

dictionary[ключ]

Например, получим и изменим элементы в словаре:

users = {
    "+11111111": "Tom",
    "+33333333": "Bob",
    "+55555555": "Alice"
}
 
# получаем элемент с ключом "+11111111"
print(users["+11111111"])      # Tom
 
# установка значения элемента с ключом "+33333333"
users["+33333333"] = "Bob Smith"
print(users["+33333333"])      # Bob Smith

Если при установки значения элемента с таким ключом в словаре не окажется, то произойдет его добавление:

users["+4444444"] = "Sam"

Но если мы попробуем получить значение с ключом, которого нет в словаре, то Python сгенерирует ошибку KeyError:

user = users["+4444444"]    # KeyError

И чтобы предупредить эту ситуацию перед обращением к элементу мы можем проверять наличие ключа в словаре с помощью выражения ключ in словарь. Если ключ имеется в словаре, то данное выражение возвращает True:

key = "+4444444"
if key in users:
    user = users[key]
    print(user)
else:
    print("Элемент не найден")

Также для получения элементов можно использовать метод get, который имеет две формы:

  • get(key): возвращает из словаря элемент с ключом key. Если элемента с таким ключом нет, то возвращает значение None
  • get(key, default): возвращает из словаря элемент с ключом key. Если элемента с таким ключом нет, то возвращает значение по умолчанию default
    key = "+55555555"
    user = users.get(key)
    user = users.get(key, "Unknown user")