> For the complete documentation index, see [llms.txt](https://opu.gitbook.io/101/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://opu.gitbook.io/101/sprint-1.-bazovye-znaniya-i-osnovy-programmirovaniya/2.-osnovy-python/slovari.md).

# Словари

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

Словарь в Python представляет собой совокупность пар "ключ-значение". Каждый ключ связывается с некоторым значением, и программа моет получить значение, связанное с заданным ключом. Значением может быть число, строка, список и даже другой словарь. Собственно, любой объект, создаваемый в программе Python, может стать значением в словаре.

В Python словарь заключается в фигурные скобки `{}`, в которых приводится последовательность пар "ключ-значение"

```python
student = {'name': 'Василий', 'last_name': 'Иванов'}
```

Пара "ключ-значение" представляет данные, связанные друг с другом. Если вы укажете ключ, то Python вернет значение, связанное с этим ключом. Ключ отделяется от значения двоеточием, а отдельные пары разделяются запятыми. В словаре может храниться любое количество пар "ключ-значение".

Простейший словарь содержит ровно одну пару "ключ-значение", как в следующем примере

```python
student = {'name': 'Василий'}
```

В этом словаре хранится ровно один фрагмент информации о студенте, а именно его имя. Строка `'name'` является ключом в словаре; с этим ключом связано значение `'Василий'`.

#### Обращение к значениям в словаре

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

```python
student = {'name': 'Василий'}
print(student['name'])
```

Эта конструкция возвращает значение, связанное с ключом `'name'` из словаря `student`.

```python
Василий
```

#### Добавление новых пар "ключ-значение"

Словари относятся к динамическим структурам данных: в словарь можно в любой момент добавлять новые пары "ключ-значение". Для этого указывается имя словаря, за которым в квадратных скобках следует новый ключ с новым значением.

Добавим в словарь `student` еще два атрибута: номер группы и дату рождения.&#x20;

```python
student = {'name': 'Василий', 'last_name': 'Иванов'}
print(student)

student['group'] = 'АП-201'
student['dob'] = '01/10/2002'
print(student)
```

Окончательная версия словаря содержит четыре пары "ключ-значение".

```python
{'name': 'Василий', 'last_name': 'Иванов'}
{'name': 'Василий', 'last_name': 'Иванов', 'group': 'АП-201', 'dob': '01/10/2002'}
```

#### Создание пустого словаря

В некоторых ситуациях бывает необходимо начать с пустого словаря, а затем добавлять в него новые элементы. Чтобы начать заполнение пустого словаря, определите словарь с пустой парой фигурных скобок, а затем добавляйте новые пары "ключ-значение" (каждая пара в отдельной строке).

```python
student = {}
student['name'] = 'Василий'
student['last_name'] = 'Иванов'
```

Обычно пустые словари используются при хранении данных, введенных пользователем, или при написании код, автоматически генерирующего большое количество пар "ключ-значение".

#### Изменение значений в словаре

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

```python
student = {}
student['name'] = 'Василий'
student['last_name'] = 'Иванов'
print(student)

student['name'] = 'Петр'
print(student)
```

Консоль выведет

```python
{'name': 'Василий', 'last_name': 'Иванов'}
{'name': 'Петр', 'last_name': 'Иванов'}
```

#### Удаление пар "ключ-значение"

Когда информация, хранящаяся в словаре, перестает быть нужной, пару "ключ-значение" можно полностью удалить при помощи команды `del`. При вызове достаточно передать имя словаря и удаляемый ключ

```python
student = {}
student['name'] = 'Василий'
student['last_name'] = 'Иванов'
print(student)

del student['name']
print(student)
```

Консоль выведет

```python
{'name': 'Василий', 'last_name': 'Иванов'}
{'last_name': 'Иванов'}
```

#### Обращение к значениям с помощью функции get()

Использование синтаксиса с ключом в квадратных скобках для получения интересующего вас значения из словаря имеет один потенциальный недостаток: если запрашиваемый ключ не существует, то вы получите сообщение об ошибке.

```
student = {}
student['name'] = 'Василий'
student['last_name'] = 'Иванов'

print(student['group'])
```

Консоль выведет

```python
Traceback (most recent call last):
  File "C:/py/main.py", line 313, in <module>
    print(student['group'])
KeyError: 'group'

```

Чтобы избежать закрытия программы и вывода сообщения об ошибке, можно воспользоваться функцией `get()` для назначения значения по умолчанию, которое будет возвращено при отсутствии заданного ключа в словаре.

В первом аргументе метода `get()` передается ключ. Во втором необязательном аргументе можно передать значение, которое должно возвращаться при отсутствии ключа:

```python
student = {}
student['name'] = 'Василий'
student['last_name'] = 'Иванов'

group = student.get('group', 'No group assigned!')
print(group)
```

Если ключ `'group'` существует в словаре, вы получите соответствующее значение, если нет - будет получено значение по умолчанию. В данном случае ключ `'group'` не существует, поэтом вместо ошибки выводится понятное сообщение.

```python
No group assigned!
```

{% hint style="info" %}
Если есть вероятность того, что запрашиваемый ключ не существует, возможно, стоит использовать метод `get()` вместо синтаксиса с квадратными скобками.
{% endhint %}

Если второй аргумент при вызовет `get()` опущен, а ключ не существует, то Python вернет специальное значение `None` - признак того, что значение не существует.

### Перебор словаря

Словарь Python

Элементы словаря состоят из двух компонентов. Первый называется "ключ", второй - "значение". Аналогами словаря в Python являются различные "жизненные" словари (толковые, орфографические, лингвистические и так далее). В них ключом является слово - заголовок статьи, а значением - сама статья. Для того, чтобы получить доступ к статье, необходимо указать слово - ключ.

Простейшие примеры информации, которую в программе удобно хранить в виде словаря:

* имя человека и дата его дня рождения;
* номер авиарейса и аэропорт назначения;
* название государства и его столица.

Ключом в словаре Python может быть любой так называемый "неизменяемый тип" данных, к которому относится число, символьная строка или кортеж (неизменяемый список).

Словарь - структура данных, предназначенная для объединения взаимосвязанной информации. Доступ к элементам словаря осуществляется не по индексу, а по ключу. В качестве ключа можно указать любой неизменяемый объект, например: число, строку или кортеж. Элементы словаря могут содержать элементы произвольного типа данных и иметь неограниченную степень вложенности.&#x20;

{% hint style="info" %}
До версии Python 3.6 порядок элементов в словаре был произвольным. Начиная с версии 3.6, элементы в словаре располагаются в порядке добавления их в словарь.&#x20;

<https://docs.python.org/3/whatsnew/3.6.html#whatsnew36-compactdict>
{% endhint %}

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

Основные характеристики словарей Python

1. Они поддерживают доступ по ключу, а не по смещению - словари временами называют ассоциативными `массивами` или `хешами`. Они ассоциируют набор значений с ключами, так что извлекать элемент из словаря можно с помощью ключа, под которым он был первоначально сохранен. Для получения компонентов из словаря применяется та же операция индексации, что и в случае списка, но индекса принимает форму ключа, а не относительного смещения.
2. Они являются неупорядоченными коллекциями произвольных данных - в отличие от списка элементы, хранящиеся в словаре, не поддерживают какой-то определенный порядок; на самом деле для обеспечения быстрого поиска Python сохраняет их в псевдослучайном порядке. Ключи представляют символические (не физические) позиции элементов в словаре.
3.
