Практическое руководство по применению словарей Python. Для профи, хорошо знакомых со структурой dict, бонус об улучшенных словарях в модуле collections и применении словарей в библиотеке pandas.
1. Что такое
словарь в Python?
Словари в Python – это изменяемые отображения
ссылок на объекты, доступные
по ключу. Словари
представляют собой структуры
данных, в которых уникальные
ключи отображают значения. Ключ и значение разделяются двоеточием, пары ключ-значения отделяются запятыми, а словарь целиком ограничивается фигурными скобками {}. Ниже
приведены три словаря, содержащие
сведения о населении пяти крупнейших городов
Германии, список покупок и оценки студентов.
Три этих словаря будут использоваться далее в руководстве. Чтобы лучше разобраться в теме словарей, советуем проходить этот текст вместе с интерпретатором Python.
Кроме прямого описания, словари также можно создавать с помощью
встроенной функции dict(). Эта функция
принимает любое
количество именованных
аргументов.
Методы можно комбинировать:
Другой вариант – использовать список
кортежей. Каждый кортеж
должен содержать два объекта: ключ и значение.
Наконец, можно создать словарь,
используя два списка. Вначале строим итератор кортежей с
помощью функции zip(). Затем используем ту же функцию dict() для построения
словаря.
3. Получение значений из
словаря
Для доступа к значениям
словаря мы
не можем использовать числовой индекс
(как в случае со списками или кортежами). Однако схема извлечения значения похожа на индексацию: вместо числа в квадратные скобки подставляется ключ. При попытке получить доступ к значению с
помощью несуществующего ключа будет вызвана ошибка KeyError.
Чтобы избежать получения
исключения с несуществующими
ключами, можно воспользоваться методом
dict.get(key[, default]). Этот метод возвращает
значение для ключа, если ключ находится
в словаре, иначе возвращает значение
по умолчанию default. Если значение по умолчанию
не задано, метод возвращает None (но никогда не возвращает
исключение).
4. Добавление
элементов в словарь
Добавить одиночный элемент в
словарь можно следующим образом:
Для добавления
нескольких элементов одновременно можно применять метод dict.update([other]). Он обновляет словарь парами
ключ-значение из other,
перезаписывая существующие ключи.
Как показано выше, метод
update() может принимать в качестве аргумента
не только словарь, но и список
кортежей или именованные
аргументы.
5. Изменение элементов словаря
Изменим значение
элемента, обратившись к ключу с помощью
квадратных скобок ([]). Для изменения
нескольких значений сразу есть метод .update(). Он перезаписывает существующие
ключи.
Увеличим цену дивана на 100
единиц и изменим
оценки двух студентов.
6. Удаление элементов
словаря
Для удаления элемента из
словаря можно использовать либо del
dict[key], либо dict.pop(key[, default]). В первом случае из словаря удаляется соответствующая пара. Или, если такого ключа нет, возвращается KeyError.
Метод dict.pop(key[,
default]) удаляет из словаря
элемент с заданным ключом и возвращает
его значение. Если ключ
отсутствует, метод возвращает
значение default
. Если значение default не задано и ключа не существует, метод
pop() вызовет исключение KeyError.
7. Проверка наличия ключа
Чтобы проверить, существует ли ключ
в словаре, достаточно воспользоваться операторами принадлежности:
8. Копирование
словаря
Чтобы скопировать словарь, можно использовать метод словаря copy(). Этот метод возвращает
поверхностную
копию словаря. Мы должны
быть осторожны с такими
копиями: если словарь содержит списки, кортежи
или множества,
то в созданной
копии будут только ссылки на объекты
из оригинала.
Изменение в списке students_2 затронуло список students, так как список, содержащий вес и рост, содержит ссылки, а не дубликаты. Чтобы избежать этой проблемы,
создадим
глубокую копию, используя функцию
copy.deepcopy(x):
При использовании глубокого
копирования создается полностью
независимая копия.
Важно помнить, что оператор
= не
создаёт копию словаря. Он
присваивает другое имя,
но относящееся
к тому же словарю, т. е.
любое
изменение нового словаря
отражается на
исходном.
9. Определение
длины словаря
Чтобы выяснить сколько пар
ключ-значение содержится в словаре, достаточно воспользоваться функцией len():
10. Итерация
словаря
10.1 Итерация
ключей
Чтобы перебрать все ключи, достаточно провести итерацию по элементам объекта словаря:
10.2 Итерация
значений
Вычислим
сколько людей проживает в пяти крупнейших
городах Германии. Применим метод dict.values(), возвращающий список значений словаря:
В пяти крупнейших городах Германии живут почти 9 миллионов человек.
10.3 Итерация
ключей и
значений
В
случае, если нужно работать
с ключами и значениями одновременно, обратимся к методу
dict.items(),
возвращающему пары ключ-значение в
виде списка кортежей.
11. Генераторы
словарей
Цикл
for удобен,
но
сейчас попробуем более эффективный и
быстрый способ – генератор словарей.
Синтаксис выглядит так: {key:
value for vars in iterable}
Отфильтруем товары из словаря products по цене ниже 100 евро, используя
как цикл for,
так и генератор словарей.
Результаты
идентичны, при этом генератор словарей
записан компактнее.
12. Вложенные
словари
Вложенные
словари – это
словари, содержащие другие словари. Мы
можем создать вложенный словарь так
же, как мы создаем обычный словарь,
используя фигурные скобки.
Следующий
вложенный словарь содержит информацию
о пяти известных произведениях искусства.
Как можно заметить, значениями
словаря являются другие словари.
Создадим вложенный словарь,
используя dict(), передавая пары
ключ-значение
в
качестве именованных
аргументов.
Для
доступа к элементам во вложенном словаре указываем ключи, используя несколько
квадратных скобок ([ ][ ]).
13.
Альтернативные
типы данных
Модуль
collections
предоставляет альтернативные типы
данных: OrderedDict,
defaultdict и
Counter, расширяющие возможности обычных словарей. У нас есть подробная статья о модуле collections, которая помогает не изобретать уже известные структуры данных Python. Здесь мы остановимся на трех типах данных, наиболее близких к словарям.
13.1. OrderedDict
OrderedDict
содержит
словарь, хранящий порядок добавления
ключей. В
Python 3.6+ словари запоминают порядок,
а
для предыдущих
версий Python можно использовать OrderedDict.
С
OrderedDict
можно
использовать
операции
с элементами, методы и
функции, как при
работе с
обычным словарем.
13.2. defaultdict
defaultdict – подкласс
словаря, присваивающий
значение
по умолчанию при отсутствии ключа. Он
никогда не выдаст
KeyError,
если
мы попробуем
получить
доступ к элементу, который отсутствует
в словаре. Будет
создана новая запись. В приведенном ниже примере
ключи создаются с
различными значениями в зависимости
от функции, используемой в качестве
первого аргумента.
13.3. Counter
Counter – подкласс
словаря, подсчитывающий
объекты хеш-таблицы.
Функция возвращает объект Counter,
в
котором элементы хранятся как ключи, а
их количество в виде значений. Эта функция позволяет подсчитать элементы
списка:
Как
показано выше, мы можем легко получить
наиболее часто используемые элементы
с помощью метода most_common([n]). Этот метод
возвращает список n наиболее часто
встречающихся элементов и их количество.
14.
Создание
Pandas DataFrame из
словаря
Pandas
DataFrame – это
двумерная
таблица
со
строками и столбцами, создаваемая в библиотеке анализа данных pandas. Это очень мощная библиотека для работы с данными. Ранее мы рассказывали как можно анализировать данные с помощью одной строки на Python в pandas (да и вообще о разных трюках работы с библиотекой).
Объект DataFrame
создается
с помощью функции pandas.DataFrame(),
принимающей различные типы данных
(списки, словари, массивы numpy).
В этой статье разберем
только те способы создания датафрейма, которые
предполагают использование словарей.
14.1. Создание DataFrame из
словаря
Создадим DataFrame из словаря,
где ключами
будут имена столбцов,
а значениями – данные столбцов:
По умолчанию индексом
является номер строки (целое число,
начинающееся с 0). Изменим
индексы, передав список индексов
в DataFrame.
14.2. Создание DataFrame из
списка словарей
Список словарей также может быть
использован для создания DataFrame, где
ключи – имена
столбцов. Как и раньше, мы можем изменять
индексы, передавая список индексов в
функцию DataFrame.
15. Функции в Pandas,
использующие словари
В Pandas есть несколько функций, использующих
словари в качестве входных значений,
например, pandas.DataFrame.rename
и
pandas.DataFrame.replace.
15.1. pandas.DataFrame.rename
Эта функция возвращает DataFrame с
переименованными метками осей. На
вход можно подать
словарь, в котором ключи – старые имена, а значения – новые. Метки,
не содержащиеся в словаре, остаются
неизменными.
15.2. pandas.DataFrame.replace
Эта функция меняет значения
DataFrame на другие значения.
Мы можем использовать
словарь с функцией замены для изменения
DataFrame, где ключи представляют
собой
существующие записи, а значения –
новые.
***
Итак, мы рассмотрели разные способы создания словаря, базовые операции (добавление, изменение, удаление элементов). Также мы узнали когда стоит использовать глубокую копию словаря вместо поверхностной. Научились строить матрёшки – вложенные словари. Такие конструкции встретятся, когда вы будете качать, например, с ВКонтакте через его API разнообразную информацию.
Если вы любите Python, Библиотека программиста подготовила ещё много интересных материалов об этом замечательном языке: