Тип данных "Словарь" (dict , ассоциативный массив)
Разберем еще один составной типа данных Python, называемый словарем, который похож на список в том смысле, что он представляет собой набор объектов.
Словари и списки имеют следующие характеристики:
- оба изменяемы;
- оба являются динамическими (могут увеличиваться и уменьшаться в размере по мере необходимости);
- оба могут быть вложенными (список может содержать другой список, словарь может содержать другой словарь, словарь также может содержать список, и наоборот).
Словари отличаются от списков прежде всего тем, как осуществляется доступ к элементам:
- доступ к элементам списка осуществляется по их положению в списке через индексацию;
- доступ к элементам словаря осуществляется с помощью ключей.
Словари - это структура данных, реализованная в Python, более известная как ассоциативный массив. Словарь состоит из набора пар ключ-значение. Каждая пара "ключ-значение" сопоставляет ключ с соответствующим значением.
Создание словаря
Создать словарь можно заключив список пар ключ-значение, разделенный запятыми, в фигурные скобки ( {} ). Двоеточие ( : ) отделяет каждый ключ от связанного с ним значения:
d = {
<key>: <value>,
<key>: <value>,
.
.
.
<key>: <value>
}
P.S.: В записи выше, треугольные скобки <key> и <value> используются для обозначения местозаполнителей. Это значит, что вместо них вы должны подставить конкретные ключи и значения, которые хотите использовать в словаре.
Пример 1: Создание словаря при помощи фигурных скобок:
# Создание словаря с информацией о фруктах
fruits = {"яблоко": 5, "апельсин": 3, "банан": 7}
В этом примере ключами словаря являются названия фруктов ("яблоко", "апельсин", "банан"), а значениями - количество каждого фрукта.
Пример 2: Последовательное добавление элементов в пустой словарь:
# Создание пустого словаря и добавление элементов
employee = {}
employee["имя"] = "Иванов"
employee["возраст"] = 30
employee["подразделение"] = "Продажи"
Функция dict()
Можно создать словарь с помощью встроенной функции dict() функции. Аргумент dict() должен быть последовательностью пар ключ-значение . Для этого хорошо подходит список кортежей:
d = dict([
(<key>, <value>),
(<key>, <value),
.
.
.
(<key>, <value>)
])
Пример 3: Создание словаря из кортежей с помощью ключей и значений:
# Создание словаря из кортежей
pairs = [(1, 'один'), (2, 'два'), (3, 'три')]
dictionary = dict(pairs)
print(dictionary) # Вывод: {1: 'один', 2: 'два', 3: 'три'}
Здесь мы создаем словарь из списка кортежей pairs, где первый элемент каждого кортежа будет ключом, а второй элемент - значением.
Пример 4: Создание словаря путем передачи аргументов ключей и значений:
# Создание словаря через передачу аргументов
dictionary = dict(яблоко=5, апельсин=3, банан=7)
print(dictionary) # Вывод: {'яблоко': 5, 'апельсин': 3, 'банан': 7}
Здесь мы передаем аргументы с ключами и их соответствующими значениями, и функция dict() создает словарь на их основе.
Вывод элементов словаря
Вывести содержимое списка на экран можно просто командой print() . Записи в словаре отображаются в том порядке, в котором они были созданы.
# Создаем словарь
my_dict = { "Alice": 30, "Bob": 25, "Charlie": 35 }
# Выводим словарь
print(my_dict)
Этот код выведет словарь в следующем формате:
{'Alice': 30, 'Bob': 25, 'Charlie': 35}
Характеристики словаря
Порядок: В отличие от последовательностей (например, списков, кортежей), словари не упорядочены до версий python 3.7. После версии 3.7 они упорядочиваются.
Мутабельность: Словари могут быть изменены (элементы могут быть добавлены, удалены или изменены).
Уникальность: Ключи в словаре должны быть уникальными.
|
Доступ к элементам словаря
Чтобы работать с элементами словаря, они должны быть как-то доступны. Если вы не можете получить их по индексу, то как их получить?
Значение извлекается из словаря путем указания соответствующего ключа в квадратных скобках ( [] ).
Например, вывод на экран столицу Абхазии из созданного в предыдущем задании словаря:
print(dict_country['Abkhazia'])
Если вы ссылаетесь на ключ, которого нет в словаре, Python вызывает исключение:
print(dict_country['Russia'])
Traceback (most recent call last): File "<...>", line ..., in <module>
print(dict_country['Russia'])
KeyError: 'Russia'
Добавление элементов в словарь
Для добавления записи в существующий словарь достаточно просто назначить новый ключ и значение:
dict_country['Russia'] = 'Moscow'
Обновление записи в словаре
Если вы хотите обновить запись, вы можете просто присвоить новое значение существующему ключу:
dict_country['Russia'] = 'Москва'
Удаление элементов из словаря
Чтобы удалить запись, используйте оператор del , указав ключ для удаления:
del dict_country[<ключ>]
Например,
del dict_country['Russia']
Хотя доступ к элементам в словаре не зависит от порядка, Python гарантирует, что порядок элементов в словаре сохраняется. При отображении элементы будут отображаться в том порядке, в котором они были определены, и повторение ключей также будет происходить в этом порядке. Элементы, добавленные в словарь, добавляются в конце. Если элементы удаляются, порядок остальных элементов сохраняется.
Следует запомнить, что ключи словаря как и элементы словаря могут быть разного типа. Словарь может быть и такого содержимого:
d = {42: [2, 3, 6, 7], 2.78: 'bbb', True: 1} print(d[42][1]) # 3
В следующих задачах мы разберем почему здесь такой вывод.
|
Список всех ключей словаря
Функция keys() в Python — это метод, который используется для получения всех ключей из словаря.
Описание метода keys()
Синтаксис:
dict.keys()
Метод keys() возвращает представление (view) всех ключей в словаре. Это представление является динамическим, что означает, что если словарь изменяется (например, добавляются или удаляются ключи), то и представление ключей будет обновляться автоматически.
Пример
my_dict = {
'name': 'Arina',
'age': 15,
'city': 'Chelyabinsk'
}
# получение ключей словаря
keys = my_dict.keys()
print(keys) # Вывод: dict_keys(['name', 'age', 'city'])
# перебор ключей
for key in my_dict.keys():
print(key)
# преобразование в список
keys_list = list(my_dict.keys())
print(keys_list) # Вывод: ['name', 'age', 'city']
# ключи автоматически обновляются при добавлении нового
my_dict['country'] = 'Russia'
print(keys) # Вывод: dict_keys(['name', 'age', 'city', 'country'])
Обратите внимание, после добавления нового ключа, мы не обновляли значение keys (не сохраняли в данную переменную список ключей заново, добавление нового значения произошло автоматически).
|
Список всех ключей словаря
Функция values() в Python — это метод, который используется для получения всех значений из словаря.
Описание метода values()
Синтаксис:
dict.values ()
Метод values() возвращает представление всех значений в виде объекта dict_values , который можно преобразовать в список или использовать в других операциях. Этот объект можно итерировать (проходиться по нему по элементам циклом for ), но он не является списком. Если вам нужен список, вы можете преобразовать его с помощью функции list() . Объект dict_values является динамическим, что означает, что если словарь изменяется, то и объект dict_values будет отражать эти изменения.
Пример
my_dict = {
'name': 'Arina',
'age': 15,
'city': 'Chelyabinsk'
}
# получение значений словаря
values = my_dict.values()
print(values) # Вывод: dict_values(['Arina', 15, 'Chelyabinsk'])
# перебор значений
for value in my_dict.values():
print(value)
# преобразование в список
value_list = list(my_dict.values())
print(value_list) # Вывод: ['Arina', 15, 'Chelyabinsk']
# Значения автоматически обновляются при добавлении нового
my_dict['country'] = 'Russia'
print(values) # Вывод: dict_values(['Arina', 15, 'Chelyabinsk', 'Russia'])
Обратите внимание, после добавления нового значения, мы не обновляли значение values (не сохраняли в данную переменную список значений заново, добавление нового значения произошло автоматически).
|
Список всех пар словаря (ключ, значение)
Функция items() в Python — это метод, который позволяет получить представление всех пар "ключ-значение" в словаре.
Описание метода items()
Синтаксис:
dict.items ()
Метод возвращает объект dict_items , который является итерируемым. Вы можете использовать его в циклах, например, в цикле for . Если вам нужен список, вы можете преобразовать его с помощью функции list() . Объект dict_items является динамическим, что означает, что если словарь изменяется, то и объект dict_items будет отражать эти изменения.
Пример
my_dict = {
'name': 'Arina',
'age': 15,
'city': 'Chelyabinsk'
}
# получение всех пар словаря (ключ, значение)
p = my_dict.items()
print(p) # Вывод: dict_items([('name', 'Arina'), ('age', 15), ('city', 'Chelyabinsk')])
# перебор пар ключ-значений
for key, value in my_dict.items():
print(key, value)
# преобразование в список
p_list = list(my_dict.items())
print(p_list) # Вывод: [('name', 'Arina'), ('age', 15), ('city', 'Chelyabinsk')]
# Значения автоматически обновляются при добавлении нового
my_dict['country'] = 'Russia'
print(p) # Вывод: dict_items([('name', 'Arina'), ('age', 15), ('city', 'Chelyabinsk'), ('country', 'Russia')])
Обратите внимание, после добавления нового значения, мы не обновляли значение p (не сохраняли в данную переменную список пар значений заново, добавление новой пары значений произошло автоматически).
|
Метод get()
Метод get() в словарях Python — это удобный способ получения значения по ключу с возможностью указания значения по умолчанию, если ключ отсутствует в словаре. Это позволяет избежать возникновения ошибки KeyError , которая возникает, если вы пытаетесь получить значение по несуществующему ключу.
Синтаксис
dict.get(key, default=None)
- key: Ключ, значение которого вы хотите получить.
- default (необязательный): Значение, которое будет возвращено, если ключ не найден. Если не указано, по умолчанию возвращается
None .
Пример
my_dict = {}
value = my_dict.get('d', 'Ключ не найден')
print(value) # Вывод: Ключ не найден
Встроенные методы работы со словарями
Некоторые методы, с которыми вы знакомились при изучении строк, списков и кортежей также работают со словарями. Например, метод in (или not in ) позволяет определить есть ли определенный ключ в словаре.
Другие, часто используемые методы приведены в таблице.
Название |
Метод |
Описание (пример) |
размер словаря |
len() |
возвращает число элементов в словаре
len(dict_country)
|
обновление словаря |
update() |
позволяет обновить сразу несколько пар словаря
dict_country.update({'Russia': 'Москва', 'Armenia': 'Ереван'})
|
получение значения по ключу |
get(key, default=None) |
позволяет получить значение по указанному ключу. Можно использовать для проверки наличия того или иного ключа в словаре
dict_country.get('Russia') # возвращает значение по ключу,
# если такого ключа нет, то вернет None
dict_country.get('Russa', 0) # если ключа Russia нет, то вернет 0
# (вместо 0 можно задать любое значение
|
удаление ключа |
pop(key, default=None) |
Удаляет элемент с указанным ключом и возвращает его значение. Если ключ не найден, возвращает значение по умолчанию (default ).
dict_country.pop('Bahamas')
|
ключи словаря |
keys() |
Метод keys() возвращает список ключей в словаре.
dict_country.keys()
|
значения словаря |
values() |
Метод values() возвращает список значений в словаре.
dict_country.values()
|
пары словаря |
items() |
Метод items() возвращает список пар кортежей словаря (ключ, значение).
dict_country.items()
|
удаление всех элементов словаря |
clear() |
|
поверхностное копирование |
copy() |
делает поверхностную копию словаря: изменение исходного словаря будет отражаться на его копии |
создание нового словаря из списка ключей |
fromkeys(iterable, value=None) |
Создает новый словарь с ключами из iterable и значением value для всех ключей.
new_dict = dict.fromkeys(['a', 'b', 'c'], 0) |
|
Сортировка словаря
В Python словари (начиная с версии 3.7) сохраняют порядок добавления элементов, но для сортировки словарей по ключам или значениям можно использовать несколько подходов.
1. Сортировка по ключам
Использование функции sorted()
Вы можете использовать функцию sorted() для получения отсортированного списка ключей, а затем создать новый словарь:
my_dict = {'b': 2, 'a': 1, 'c': 3}
# Сортировка по ключам
sorted_dict_by_keys = {key: my_dict[key] for key in sorted(my_dict)}
print(sorted_dict_by_keys) # Вывод: {'a': 1, 'b': 2, 'c': 3}
2. Сортировка по значениям
Использование функции sorted()
Для сортировки по значениям
my_dict = {'b': 2, 'a': 1, 'c': 3}
# Сортировка по значениям
sorted_dict_by_values = {key: value for key, value in sorted(my_dict.items(), key=lambda item: item[1])}
print(sorted_dict_by_values) # Вывод: {'a': 1, 'b': 2, 'c': 3}
3. Сортировка с использованием lambda и key
Вы можете использовать lambda для более сложных критериев сортировки:
my_dict = {'b': 2, 'a': 1, 'c': 3, 'd': 2}
# Сортировка по значениям, а затем по ключам
sorted_dict = {key: value for key, value in sorted(my_dict.items(), key=lambda item: (item[1], item[0]))}
print(sorted_dict) # Вывод: {'a': 1, 'b': 2, 'd': 2, 'c': 3}
|
Сортировка словаря
В Python словари (начиная с версии 3.7) сохраняют порядок добавления элементов, но для сортировки словарей по ключам или значениям можно использовать несколько подходов.
1. Сортировка по ключам
Использование функции sorted()
Вы можете использовать функцию sorted() для получения отсортированного списка ключей, а затем создать новый словарь:
my_dict = {'b': 2, 'a': 1, 'c': 3}
# Сортировка по ключам
sorted_dict_by_keys = {key: my_dict[key] for key in sorted(my_dict)}
print(sorted_dict_by_keys) # Вывод: {'a': 1, 'b': 2, 'c': 3}
2. Сортировка по значениям
Использование функции sorted()
Для сортировки по значениям
my_dict = {'b': 2, 'a': 1, 'c': 3}
# Сортировка по значениям
sorted_dict_by_values = {key: value for key, value in sorted(my_dict.items(), key=lambda item: item[1])}
print(sorted_dict_by_values) # Вывод: {'a': 1, 'b': 2, 'c': 3}
3. Сортировка с использованием lambda и key
Вы можете использовать lambda для более сложных критериев сортировки:
my_dict = {'b': 2, 'a': 1, 'c': 3, 'd': 2}
# Сортировка по значениям, а затем по ключам
sorted_dict = {key: value for key, value in sorted(my_dict.items(), key=lambda item: (item[1], item[0]))}
print(sorted_dict) # Вывод: {'a': 1, 'b': 2, 'd': 2, 'c': 3}
|