# Полный обзор словарей в Python

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

* Основы создания словарей для хранения и доступа к данным
* Лучшие случаи использования словарей
* Добавление и удаление данных в словарях
* Как применять функции и методы к словарям

Оглавление

* [Что такое словари Python?](#chto-takoe-slovari-python)
* [Как словари связаны с наукой о данных?](#kak-slovari-svyazany-s-naukoi-o-dannykh)
* [Работа со словарями Python](#rabota-so-slovaryami-python)
  * [Доступ к элементам в словарях Python](#dostup-k-elementam-v-slovaryakh-python)
  * [Добавление элементов в словари Python](#dobavlenie-elementov-v-slovari-python)
  * [Изменение существующих элементов словаря Python](#izmenenie-sushestvuyushikh-elementov-slovarya-python)
  * [Удаление элементов из словарей в Python](#udalenie-elementov-iz-slovarei-v-python)
* [Методы словаря Python](#metody-slovarya-python)
  * [Доступ к элементам словаря с помощью .items()](#dostup-k-elementam-slovarya-s-pomoshyu-.items)
  * [Доступ к словарю ключей с помощью .keys()](#dostup-k-klyucham-slovarya-s-pomoshyu-.keys)
  * [Доступ к словарю значений с помощью .values()](#dostup-k-znacheniyam-slovarya-s-pomoshyu-.values)
  * [Проверка членства в словарях Python](#proverka-chlenstva-v-slovaryakh-python)
* [Перебор словарей Python](#perebor-slovarei-python)
* [Упорядочены ли словари Python?](#uporyadocheny-li-slovari-python)
* [Упражнение](#uprazhnenie)
* [Заключение и резюме](#zaklyuchenie-i-rezyume)
* [Дополнительные ресурсы](#dopolnitelnye-resursy)

### Что такое словари Python?

<mark style="color:purple;">**Python словари**</mark> — это контейнерные типы данных, как и списки в Python. Словари используют сопоставление ключ-значение, позволяя извлекать значение, ища соответствующий ключ. Они очень похожи на то, что в других языках программирования называется ассоциативными массивами. Это потому, что это массив данных, который ассоциируется с чем-то другим — в данном случае, с ключом.

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

```python
# Получение второго элемента в списке Python
names = ['Nik', 'Kate', 'Evan', 'Kyra']
second_name = names[1]  # Индексация в Python начинается с 0, поэтому второй элемент имеет индекс 1
print(second_name)

# Возвращает: Kate
```

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

В Python словаре может быть несколько ключей. Эти ключи должны быть:

* Уникальный – заданный ключ может существовать только один раз
* Неизменяемый – это значит, что ключи должны быть таких типов данных, которые нельзя изменить, например, строки

Думайте о словарях Python как о обычных словарях. Вы можете найти значение слова (т.е. ключ) и оно даст вам соответствующее определение (т.е. его значение).

#### Создание словаря Python

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

```python
# Создание словаря в Python
dictionary1 = {}       # Пустой словарь, созданный с использованием фигурных скобок
dictionary2 = dict()   # Пустой словарь, созданный с использованием функции dict()
```

Мы можем проверить тип этих словарей, используя встроенную функцию

```python
# Проверка типов словарей в Python
print(type(dictionary1))  # Проверяем тип dictionary1
print(type(dictionary2))  # Проверяем тип dictionary2

# Возвращает:
# <class 'dict'>
# <class 'dict'>
```

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

```python
# Создание примерного словаря в Python
nik = {
    'age': 33,  # Возраст
    'location': 'Toronto',  # Местоположение
    'company': 'bemind.gitbook.io',  # Компания
    'hobbies': ['Python', 'Long walks on the beach', 'Travel']  # Хобби
}
```

Здесь мы видим, что смогли встроить несколько разных элементов в качестве значений. Например, у нас есть целое число (представляющее возраст), строки (представляющие, скажем, местоположение) и даже списки!

Вы не обязаны писать это на разных строках, но так легче читать. Мы могли бы сделать то же самое, просто написав:

```python
# Создание примерного словаря в Python
nik = {
    'age': 33,  # Возраст
    'location': 'Toronto',  # Местоположение
    'company': 'bemind.gitbook.io',  # Компания
    'hobbies': ['Python', 'Long walks on the beach', 'Travel']  # Хобби
}
```

Теперь, когда у вас есть хорошее понимание того, как создавать словари в Python, давайте взглянем на то, как их использовать.

### Как словари связаны с наукой о данных?

На этом этапе вы можете задаться вопросом, как связаны словари с наукой о данных? Когда мы получаем данные из интернета, они часто приходят в формате, известном как JSON (**J**ava**S**cript **O**bject **N**otation). Этот формат очень похож на формат словарей в Python.

Знание работы с Python-словарями позволяет легко загружать данные из интернета и манипулировать ими. Этот формат невероятно распространен и предоставляет значительно большую гибкость в доступе к данным из различных источников.

### Работа со словарями Python

Создание словарей в Python – это одно, но нужно также уметь работать с ними. В этом разделе вы научитесь различным способам доступа к элементам словаря, изменению элементов, а также добавлению и удалению элементов. Существуют разные способы достижения всего этого, но вы изучите самые безопасные и распространенные методы.

#### Доступ к элементам в словарях Python

Существуют два основных способа доступа к элементам внутри словаря. Можно использовать квадратные скобки, `[]`, аналогично обращению к элементу списка по его индексу. Также можно использовать метод `.get()`

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

```python
# Доступ к элементам словаря с помощью квадратных скобок
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}
print(info['name'])  # Получаем значение по ключу 'name'

# Возвращает: Nik
```

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

Попробуйте запустить приведенный ниже код для доступа к элементу, который не существует, например, `'hobbies'`, чтобы увидеть, что произойдет:

Мы видим, что при попытке доступа к несуществующему элементу выбрасывается `KeyError`. Это указывает на то, что ключ не существует. Хуже всего то, что это фактически приводит к сбою нашей программы (если мы явно не обрабатываем эту ошибку).

Один из способов обойти это - использовать метод `.get()`. Метод `.get()` просто вернет значение `None`, когда ключ не существует.

Метод работает путем применения его к словарю и передачи ключа, значение которого мы хотим вернуть. Давайте посмотрим, как мы можем использовать это для возврата значения для `'name'`

```python
# Доступ к элементам словаря с помощью метода get
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}
print(info.get('name'))  # Получаем значение по ключу 'name' с помощью метода get

# Возвращает: Nik
```

Одно из преимуществ использования метода `.get()` заключается в том, что мы можем передать значение по умолчанию, которое мы хотим получить, если ключ не существует. Например, если у нас должен был быть ключ с именем `'hobbies'`, содержащий список различных увлечений, мы можем попросить Python вернуть пустой список вместо `None.`

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

#### Добавление элементов в словари Python

Добавление элементов в словарь Python невероятно просто! Мы можем просто напрямую присвоить паре `key:value` словарь.

Давайте посмотрим, как это выглядит. Мы захотим добавить пункт о хобби в наш словарь.

```python
# Добавление элементов в словарь Python
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}
info['hobbies'] = ['Coding', 'Long Walks on the Beach']  # Добавляем новый ключ 'hobbies' и его значение

print(info)
# Возвращает: {'name': 'Nik', 'age': 33, 'location': 'Toronto', 'hobbies': ['Coding', 'Long Walks on the Beach']}
```

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

Для этого можно использовать метод `.update()`. Аналогично, в Python 3.8+ можно использовать оператор `|`. Оба метода работают одинаково: словарь справа будет объединен со словарем слева. Любые новые пары "ключ-значение" будут добавлены, а существующие ключи в левом словаре будут обновлены значениями из правого.

```python
# Объединение двух словарей в Python
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}
more_info = {'company': 'datagy.io', 'location': 'Toronto, ON'}

info.update(more_info)  # Объединяем словари (существующие ключи перезаписываются значениями из more_info)

print(info)
# Возвращает: {'name': 'Nik', 'age': 33, 'location': 'Toronto, ON', 'company': 'datagy.io'}
```

Мы видим, что новые элементы из словаря `more_info` были добавлены, а существующие элементы были обновлены. Имейте это в виду при обновлении информации!

#### Изменение существующих элементов словаря Python

Изменение существующих элементов работает так же, как добавление новых! Мы можем просто напрямую присвоить значение существующему ключу и обновить его значение. Дополнительное преимущество в том, что если элемент не существует, то добавляется новый.

Давайте рассмотрим добавление изменения нашего ключа `'location'` в нашем словаре:

```python
# Изменение элементов в словаре Python
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}
info['location'] = 'Toronto, ON'  # Изменяем значение по ключу 'location'

print(info)

# Возвращает: {'name': 'Nik', 'age': 33, 'location': 'Toronto, ON'}
```

Нет ничего сложного в этом! Давайте посмотрим, как удалять элементы из словаря в Python.

#### Удаление элементов из словарей в Python

Подобно спискам, Python предоставляет несколько способов удаления элементов из словарей. Первый подход, который мы рассмотрим, — использование ключевого слова `del`. Это ключевое слово принимает элемент словаря и удаляет его из словаря.

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

```python
# Удаление элемента из словаря с помощью del
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}
del info['age']  # Удаляем элемент с ключом 'age'

print(info)

# Возвращает: {'name': 'Nik', 'location': 'Toronto'}
```

Мы также можем использовать метод `.pop()` в Python, чтобы удалить элемент из словаря. Преимущество этого подхода в том, что он возвращает значение до удаления пары ключ-значение. Давайте посмотрим, как это выглядит:

```python
# Использование метода .pop() для удаления элемента из словаря
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}
age = info.pop('age')  # Удаляем элемент с ключом 'age' и возвращаем его значение

print(age)  # Выводим удаленное значение 'age'
print(info)  # Выводим обновленный словарь без удаленного элемента

# Возвращает: 
# 33
# {'name': 'Nik', 'location': 'Toronto'}
```

Оба этих метода требуют внимательности, чтобы не удалять несуществующие ключи. Оба этих метода вернут `KeyError`, если мы попытаемся удалить несуществующий ключ. Давайте это подтвердим:

```python
# Попытка удалить ключ, которого не существует
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}

# Пытаемся удалить ключ 'hobbies', которого нет в словаре
# В результате возникает исключение KeyError, так как ключ 'hobbies' отсутствует в словаре
age = info.pop('hobbies')

# Вызывает: KeyError: 'hobbies'
```

Метод `.pop()` позволяет нам задать значение по умолчанию, чтобы программа не завершалась с ошибкой, если ключ не существует. Это позволяет нам безопаснее запускать программу.

Давайте посмотрим, как это работает:

```python
# Безопасное использование метода .pop() с заданным значением по умолчанию
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}

# Пытаемся удалить ключ 'hobbies', если он есть в словаре. Если ключа нет, возвращается значение по умолчанию - пустой список.
age = info.pop('hobbies', [])

print(age)

# Возвращает: []
```

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

### Методы словаря Python

В Python используется множество методов для работы со словарями – некоторые из них вы уже знаете! В этом разделе вы познакомитесь с новыми методами, которые помогут вам работать с ключами и значениями словарей.

#### Доступ к элементам словаря с помощью .items()

Мы можем использовать метод `.items()`, чтобы легко получить все элементы в словаре. Применение этого метода возвращает объект, похожий на список, содержащий кортежи с ключом и значением каждого элемента словаря.

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

```python
# Получение элементов словаря с помощью метода .items()
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}

# Метод .items() возвращает представление словаря в виде списка кортежей (ключ, значение)
print(info.items())

# Возвращает: dict_items([('name', 'Nik'), ('age', 33), ('location', 'Toronto')])
```

Мы можем перебирать объект `dict_items`, чтобы получить доступ как к ключам, так и к значениям.&#x20;

#### Доступ к ключам словаря с помощью .keys()

Мы можем легко получить доступ ко всем ключам в словаре, используя метод `.keys()`. Он возвращает объект, похожий на список, который содержит все ключи.

Давайте возьмем наш предыдущий словарь и применим метод `.keys()`

```python
# Получение всех ключей словаря с помощью метода .keys()
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}

# Метод .keys() возвращает представление всех ключей словаря
print(info.keys())

# Возвращает: dict_keys(['name', 'age', 'location'])
```

#### Доступ к значениям словаря с помощью .values()

Подобно методу `.keys()`, мы можем получить доступ ко всем значениям в словаре Python с помощью метода `.items()`. Этот метод также возвращает объект, похожий на список, который содержит значения всех ключей в словаре.

Давайте применим метод `.items()` к нашему словарю:

```python
# Получение всех значений словаря с помощью метода .values()
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}

# Метод .values() возвращает представление всех значений словаря
print(info.values())

# Возвращает: dict_values(['Nik', 33, 'Toronto'])
```

#### Проверка членства в словарях Python

Для проверки наличия ключа в словаре Python удобно использовать ключевое слово `in`. Давайте посмотрим, как можно проверить, существует ли ключ в словаре, с помощью метода `.keys()`

```python
# Проверка наличия ключа в словаре
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}

if 'name' in info.keys():  # Проверяем, существует ли ключ 'name' в словаре
    print('Exists!')  # Если ключ существует, выводим 'Exists!'
else:
    print("Doesn't exist!")  # Если ключ не существует, выводим "Doesn't exist!"

# Возвращает: Exists!
```

На самом деле мы можем упростить этот процесс, не используя метод `.keys()`. По умолчанию Python будет проверять членство в ключах словаря. Из-за этого мы можем даже опустить этот метод из нашей проверки членства:

```python
# Проверка наличия ключа в словаре
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}

if 'name' in info:  # Проверяем, существует ли ключ 'name' в словаре
    print('Exists!')  # Если ключ существует, выводим 'Exists!'
else:
    print("Doesn't exist!")  # Если ключ не существует, выводим "Doesn't exist!"

# Возвращает: Exists!
```

В следующем разделе вы узнаете, как итерироваться по словарям в Python.

### Перебор словарей Python

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

Так как методы `.items()`, `.keys()`, и `.values()` возвращают объекты, похожие на списки, мы можем напрямую перебирать их. Давайте сначала посмотрим, как перебирать ключи:

```python
# Перебор всех ключей в словаре
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}

for key in info.keys():  # Перебираем все ключи в словаре
    print(key)

# Возвращает: 
# name
# age
# location
```

Этот подход работает так же для `.items()`.

Но что, если вы хотите перебрать ключи *и* значения одновременно? Для этого можно использовать так называемую *распаковку*. Мы можем перебирать возвращаемое значение метода `.items()` и распаковывать ключ и значение из возвращаемого кортежа.

Давайте посмотрим, как это выглядит:

```python
# Перебор и ключей, и значений в словаре
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}

for key, value in info.items():  # Перебираем пары ключ-значение в словаре
    print('Key = ', key, ', Value = ', value)

# Возвращает: 
# Key =  name , Value =  Nik
# Key =  age , Value =  33
# Key =  location , Value =  Toronto
```

В заключительном разделе ниже вы узнаете, являются ли словари в Python упорядоченными или нет.

### Упорядочены ли словари Python?

Ответ на вопрос о том, упорядочены ли словари в Python, не является простым да или нет. До версии 3.6 словари в Python были неупорядоченными. Начиная с версии 3.6 (и официально с версии 3.7), словари в Python стали упорядоченными.

Теперь словари Python упорядочены на основе *порядка вставки*. Это обеспечивает более быстрый доступ.

### Упражнение

Ниже вы найдете несколько упражнений, чтобы проверить ваше понимание словарей в Python. Используйте предоставленное рабочее пространство кода, чтобы протестировать ваши решения. Вы можете переключать разделы, чтобы проверить решения.

Создайте словарь, подобный приведенному ниже, и выполните следующие упражнения:

```python
# Загрузка словаря в редактор кода ниже
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto', 'company': 'bemind.gitbook.io'}
```

{% tabs %}
{% tab title="1 Упражнение" %}
**Выведите все значения словаря с использованием цикла for**

```python
for value in info.values():
    print(value)
```

{% endtab %}

{% tab title="Решение" %}

```python
# Создание словаря, аналогичного приведенному ниже
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto', 'company': 'bemind.gitbook.io'}

# Вывод всех значений словаря с помощью цикла for
for value in info.values():  # Перебираем все значения в словаре
    print(value)  # Выводим каждое значение

# Вывод:
# Nik
# 33
# Toronto
# bemind.gitbook.io
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="2 Упражнение" %}
**Добавить новый ключ, содержащий список значений**

```python
info['Favourite Snacks'] = ['Popcorn', 'Cookies']
```

{% endtab %}

{% tab title="Решение" %}

```python
# Создание словаря, аналогичного приведенному ниже
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto', 'company': 'bemind.gitbook.io'}

# Добавление нового ключа, содержащего список значений
info['Favourite Snacks'] = ['Popcorn', 'Cookies']

# Результат добавления нового ключа
# {'name': 'Nik', 'age': 33, 'location': 'Toronto', 'company': 'bemind.gitbook.io', 'Favourite Snacks': ['Popcorn', 'Cookies']}
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="3 Упражнение" %}
Обновите ключ местоположения на «Ванкувер».

```
info['location'] = 'Vancouver'
```

{% endtab %}

{% tab title="Решение" %}

```python
# Создание словаря, аналогичного приведенному ниже
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto', 'company': 'bemind.gitbook.io'}

# Обновление значения ключа 'location' на 'Ванкувер'
info['location'] = 'Ванкувер'

# Результат обновления ключа 'location'
# {'name': 'Nik', 'age': 33, 'location': 'Ванкувер', 'company': 'bemind.gitbook.io'}
```

{% endtab %}
{% endtabs %}

### Заключение и резюме

Фух! Вы дошли до конца руководства! Было много информации о словарях Python, и вы узнали о них множество новых вещей!

Краткий обзор всего, что вы узнали о словарях Python

* К элементам можно обращаться с помощью методов `.items()`, `.keys()`, и `.values()`.
* Метод `.pop()` позволяет передавать значение по умолчанию, что позволяет программе работать безопасно, если ключ не существует.
* Мы можем удалять элементы с помощью `del` или `.pop()`.
* Мы можем добавлять элементы, просто присваивая значение ключу.
* Словари похожи на формат JSON, который часто используется для хранения данных в интернете.
* Вы можете создать словари с помощью функции `dict()` или фигурных скобок `{}`.
* Значения могут быть любого типа и могут дублироваться.
* Ключи должны быть неизменяемыми и уникальными.
* Словари — это ассоциативный массив значений, содержащий пары ключ

### Дополнительные ресурсы

Посмотрите учебные пособия ниже для получения дополнительных ресурсов:

* Python: сортировка словаря по значениям
* Слияние словарей Python – объединение словарей (7 способов)
* Python: Pretty Print a Dict (словарь) – 4 способа
* Python: получить ключ словаря с максимальным значением (4 способа)
* [Официальная документация по словарям Python](https://docs.python.org/3/tutorial/datastructures.html)
