Изучаем словари в Python
Словари в Python — это фундаментальный тип данных , представленный в виде пары ключ-значение. Они описываются как объект сопоставления, который сопоставляет хэшируемые значения с произвольными объектами.
Ключи словаря должны быть неизменными, то есть они не могут изменяться. При добавлении в словарь пары ключ-значение он запоминает, в каком порядке они были добавлены.
Словари создаются несколькими способами. Наиболее распространенный метод - указание в фигурных скобках списка разделенных запятыми пар ключ - значение:
>>> sample_dict = {'first_name': 'James', 'last_name': 'Doe', 'email': 'jdoe@gmail.com'}
>>> sample_dict
{'email': 'jdoe@gmail.com', 'first_name': 'James', 'last_name': 'Doe'}
Также можно использовать для создания словаря dict(). Она принимает последовательность аргументов ключевых слов:
>>> numbers = dict(one=1, two=2, three=3)
>>> numbers
{'one': 1, 'three': 3, 'two': 2}
>>> info_list = [('first_name', 'James'), ('last_name', 'Doe'), ('email', 'jdoes@gmail.com')]
>>> info_dict = dict(info_list)
>>> info_dict
{'email': 'jdoes@gmail.com', 'first_name': 'James', 'last_name': 'Doe'}
В первом примере используется последовательность ключевых слов dict(). Вы можете представить их как серию ключевых слов со знаком равенства между ними и их значением.
Во втором примере показано, как создать список с тремя кортежами. Затем этот список передается в dict(), чтобы преобразовать его в словарь.
Доступ к словарям
Вы можете получить доступ к любому значению в словаре через ключ. Если ключ не найден, то выведется ошибка KeyError.
Рассмотрим, как использовать словарь.
>>> sample_dict = {'first_name': 'James', 'last_name': 'Doe', 'email': 'jdoe@gmail.com'}
>>> sample_dict['first_name']
'James'
Чтобы получить значение first_name, нужно использовать следующий синтаксис: dictionary_name[key]. Теперь попробуем получить ключ, который не существует.
>>> sample_dict['address']
Traceback (most recent call last):
Python Shell, prompt 118, line 1
builtins.KeyError: 'address'
Это не сработало. Мы попросили словарь предоставить значение, которого нет. Можно использовать ключевое слово Python in, чтобы спросить, есть ли ключ в словаре.
>>> 'address' in sample_dict
False
>>> 'first_name' in sample_dict
True
А также проверить, нет ли ключа в словаре, используя ключевое слово Python not:
>>> 'first_name' not in sample_dict
False
>>> 'address' not in sample_dict
True
Методы словарей Python
В словарях есть специальные методы, которые можно использовать:
d.get(ключ[, по умолчанию])
Метод get() позволяет получить значение. Ему нужно указать ключ для поиска. Можно вернуть значение по умолчанию, если ключ не будет найден. По умолчанию это None:
>>> print(sample_dict.get('address'))
None
>>> print(sample_dict.get('address', 'Not Found'))
Not Found
Первый пример иллюстрирует, что происходит, если попытаться получить ключ, которого не существует без установки значения get по умолчанию. В этом случае метод возвращается None.
Во втором примере показано, как установить по умолчанию строку “Not Found”.
d.clear()
Метод clear() используется, чтобы удалить все элементы из словаря.
>>> sample_dict = {'first_name': 'James', 'last_name': 'Doe', 'email': 'jdoe@gmail.com'}
>>> sample_dict
{'email': 'jdoe@gmail.com', 'first_name': 'James', 'last_name': 'Doe'}
>>> sample_dict.clear()
>>> sample_dict
{}
d.copy()
Чтобы создать простую копию словаря, используется метод copy().
>>> sample_dict = {'first_name': 'James', 'last_name': 'Doe', 'email': 'jdoe@gmail.com'}
>>> copied_dict = sample_dict.copy()
>>> copied_dict
{'email': 'jdoe@gmail.com', 'first_name': 'James', 'last_name': 'Doe'}
Если в словаре есть объекты или словари, то можно столкнуться с логическими ошибками. Так как изменение одного словаря может повлиять на его копию. В этом случае необходимо использовать модуль Python copy, в котором есть функция deepcopy(). Она создаетотдельную копию словаря.
d.Items()
Метод items() возвращает новое представление из элементов словаря.
>>> sample_dict = {'first_name': 'James', 'last_name': 'Doe', 'email': 'jdoe@gmail.com'}
>>> sample_dict.items()
dict_items([('first_name', 'James'), ('last_name', 'Doe'), ('email', 'jdoe@gmail.com')])
Этот объект представления будет меняться по мере изменения самого словаря.
d.keys()
Чтобы получить представление ключей, которые есть в словаре, используется метод keys(). Он предоставляет динамическое представление ключей словаря. Можно представление, а также проверить принадлежность представлению по ключевому слову in.
>>> sample_dict = {'first_name': 'James', 'last_name': 'Doe', 'email': 'jdoe@gmail.com'}
>>> keys = sample_dict.keys()
>>> keys
dict_keys(['first_name', 'last_name', 'email'])
>>> 'email' in keys
True
>>> len(keys)
3
d.values()
Метод values() возвращает объект динамического представления значений словаря.
>>> sample_dict = {'first_name': 'James', 'last_name': 'Doe', 'email': 'jdoe@gmail.com'}
>>> values = sample_dict.values()
>>> values
dict_values(['James', 'Doe', 'jdoe@gmail.com'])
>>> 'Doe' in values
True
>>> len(values)
3
d.pop(ключ[, по умолчанию])
Чтобы удалить ключ из словаря, используется метод pop(). Он принимает ключ и строку параметра по умолчанию. Если не установить значение по умолчанию и ключ не будет найден, то выведется ошибка KeyError.
>>> sample_dict = {'first_name': 'James', 'last_name': 'Doe', 'email': 'jdoe@gmail.com'}
>>> sample_dict.pop('something')
Traceback (most recent call last):
Python Shell, prompt 146, line 1
builtins.KeyError: 'something'
>>> sample_dict.pop('something', 'Not found!')
'Not found!'
>>> sample_dict.pop('first_name')
'James'
>>> sample_dict
{'email': 'jdoe@gmail.com', 'last_name': 'Doe'}
d.popitem()
Метод popitem() используется для удаления и возвращает пары ключ-значение из словаря в порядке «последним добавлен - первым удален». Если метод вызывается в пустом словаре, то отобразится KeyError.
>>> sample_dict = {'first_name': 'James', 'last_name': 'Doe', 'email': 'jdoe@gmail.com'}
>>> sample_dict.popitem()
('email', 'jdoe@gmail.com')
>>> sample_dict
{'first_name': 'James', 'last_name': 'Doe'}
d.update([другие])
Метод обновляет словарь другими парами ключ-значение, перезаписывая существующие ключи. Возвращает None.
>>> sample_dict = {'first_name': 'James', 'last_name': 'Doe', 'email': 'jdoe@gmail.com'}
>>> sample_dict.update([('something', 'else')])
>>> sample_dict
{'email': 'jdoe@gmail.com',
'first_name': 'James',
'last_name': 'Doe',
'something': 'else'}
Изменение словаря
Предположим, что нужно добавить новую пару ключ-значение.
>>> sample_dict = {'first_name': 'James', 'last_name': 'Doe', 'email': 'jdoe@gmail.com'}
>>> sample_dict['address'] = '123 Dunn St'
>>> sample_dict
{'address': '123 Dunn St',
'email': 'jdoe@gmail.com',
'first_name': 'James',
'last_name': 'Doe'}
Чтобы добавить новый элемент в словарь, можно использовать квадратные скобки для установки ключа и значения. Если нужно обновить существующий ключ, можно сделать следующее:
>>> sample_dict = {'first_name': 'James', 'last_name': 'Doe', 'email': 'jdoe@gmail.com'}
>>> sample_dict['email'] = 'jame@doe.com'
>>> sample_dict
{'email': 'jame@doe.com', 'first_name': 'James', 'last_name': 'Doe'}
В этом примере для sample_dict['email'] устанавливается значение jame@doe.com. Всякий раз, когда для ранее существовавшего ключа задается новое значение, перезаписывается предыдущее значение.
Удаление элементов из словаря
Чтобы удалить ключ из словаря, используйте ключевое слово del:
>>> sample_dict = {'first_name': 'James', 'last_name': 'Doe', 'email': 'jdoe@gmail.com'}
>>> del sample_dict['email']
>>> sample_dict
{'first_name': 'James', 'last_name': 'Doe'}
Так вы указываете Python удалить ключ «email» из sample_dict.
Также для удаления ключа используется метод pop(), который был описан в предыдущем разделе.
>>> sample_dict = {'first_name': 'James', 'last_name': 'Doe', 'email': 'jdoe@gmail.com'}
>>> sample_dict.pop('email')
'jdoe@gmail.com'
>>> sample_dict
{'first_name': 'James', 'last_name': 'Doe'}
При этом метод словаря pop() возвращает значение, которое удаляется.
Заключение
Словари удобно использовать для быстрого поиска всех типов данных. Если нужен словарь, который создаст значение по умолчанию по несуществующему ключу, примените Python collections. У него есть класс defaultdict, предназначенный для подобного варианта использования.