# Словари

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://opu.gitbook.io/101/sprint-1.-bazovye-znaniya-i-osnovy-programmirovaniya/2.-osnovy-python/slovari.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
