Помимо списков и кортежей в языке python существует еще один удобный и часто используемый тип данных для работы с коллекциями объектов — словарь. В отличие от вышеупомянутых типов данных для словаря не важен порядок элементов. Данные хранятся в словаре в виде пар ключ-значение. Каждый ключ связан с определенным значением. Давайте посмотрим пример использования словаря для хранения телефонной книги:
1 2 3 | >>> phonebook = {"Maxim": "867-5309", "Ivan Ivanovich": "281-330-8004","Masha": "900-783-3369"} >>> print phonebook {'Ivan Ivanovich': '281-330-8004', 'Maxim': '867-5309','Masha': '900-783-3369'} |
Ключи в этом примере — это имена людей, а значения — их номера телефонов. Ключ отделяется от значения двоеточием, а сами пара отделяются друга запятыми. Сами словари ограничиваются фигурными скобками, {}.
Обратите внимание на то, что элементы словаря выводятся не в том порядке, в котором мы их задавали. Python по умолчанию сортирует словари в порядке, удобном для быстрой работы с ними (в этом процессе участвует хеширование). Подобная сортировка происходит всякий раз, как содержимое словаря меняется.
Для получения какого-либо значения достаточно знать его ключ и указать его в квадратных скобках после имени словаря:
1 2 | >>> phonebook["Maxim"] '867-5309' |
Добавлять элементы в словарь также очень просто, достаточно указать в квадратных скобках новый ключ и приравнять ему нужное значение:
1 2 3 | >>> phonebook["Boris"] = "202-456-1414" >>> print phonebook {'Ivan Ivanovich': '281-330-8004', 'Boris': '202-456-1414', 'Maxim': '867-5309', 'Masha': '900-783-3369'} |
В словаре не может содержаться два одинаковых ключа. Если бы такое было возможно, то python не мог определить какое именно значение из нескольких мы хотим получить. Если мы попытаемся добавить в словарь ключ, который уже присутствует — то старое значение будет заменено новым.
1 2 3 | >>> phonebook["Maxim"] = "555-0199" >>> print phonebook {'Ivan Ivanovich': '281-330-8004', 'Boris': '202-456-1414', 'Maxim': '555-0199', 'Masha': '900-783-3369'} |
Для удаления элемента словаря применяется функция del().
1 2 3 | >>> del(phonebook["Masha"]) >>> print phonebook {'Ivan Ivanovich': '281-330-8004', 'Boris': '202-456-1414','Maxim': '555-0199'} |
Часто может понадобиться запуск цикла по ключам словаря. Получить все ключи и сделать из них список нам поможет метод keys().
1 2 | >>> print phonebook.keys() ['Ivan Ivanovich', 'Maxim', 'Boris'] |
Проверить наличие ключа в словаре мы можем с помощью ключевого слова in:
1 2 3 4 | >>> "Maxim" in phonebook True >>> "Santa" in phonebook False |
Если нужно сделать что то с каждым элементом словаря, то существует возможность перебрать весь словарь полностью. Конструкция for x in dictionary дает такую возможность.
1 2 3 4 5 6 | for contact_name in phonebook: print contact_name, phonebook[contact_name] Ivan Ivanovich 281-330-8004 Maxim 555-0199 Boris 202-456-1414 |
Выражение x in dictionary часто используется в условном операторе if (ссылку тут), например, до того, как мы хотим получить значения по ключу. Если нужного нам ключа не существует, то мы увидим ошибку.
1 2 3 4 5 6 | >>> phonebook["Santa"] Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> phonebook["Santa"] KeyError: 'Santa' |
Чтобы получить доступ к ключам в сортированном порядке, мы можем использовать функция sorted().
1 2 3 4 5 6 | for contact_name in sorted(phonebook): print contact_name, phonebook[contact_name] Maxim 555-0199 Ivan Ivanovich 281-330-8004 Boris 202-456-1414 |
Не следует забывать, что sorted() не изменяет порядок следования ключей в исходном словаре.
1 2 3 4 5 6 7 8 9 | >>> for contact_name in sorted(phonebook): print contact_name, phonebook[contact_name] Maxim 555-0199 Ivan Ivanovich 281-330-8004 Boris 202-456-1414 >>> phonebook {'Ivan Ivanovich': '281-330-8004', 'Maxim': '555-0199','Boris': '202-456-1414'} |
Словарь — очень гибкая структура данных и могут хранить не только строки. Необязательно, даже чтобы ключ со значением были одного типа. Значением может являться любая структура данных, но ключом — только неизменяемый объект. Например, мы можем сделать целочисленное значение ключом в словаре, но не сможет сделать ключом список.
Значениями в словаре могут быть и другие словари. Чтобы продемонстрировать это добавим в нашу телефонную книгу уточнение: домашние и рабочие номера.
1 2 3 4 5 6 7 | >>> contacts = {"Maxim": {"cell": "555-0199", "home": "867-5309"}, "Ivan Ivanovich": {"home": "281-330-8004"}, "Masha": {"work": "900-783-3369"}} >>> print contacts {'Ivan Ivanovich': {'home': '281-330-8004'}, 'Maxim': {'cell': '555-0199', 'home': '867-5309'}, 'Masha': {'work': '900-783-3369'}} >>> print contacts["Maxim"] {'cell': '555-0199', 'home': '867-5309'} >>> print contacts["Maxim"]["cell"] 555-0199 |
Чтобы получить конкретный номер телефона мы должны запросить contacts[«Maxim»][«cell»]. А выбирая contacts[«Maxim»] , мы получаем весь словарь, относящийся к этому ключу.
Существуют еще два альтернативных способа создания словарей, которые могут вам пригодиться в определенных ситуациях.
Если вы хотите использовать в ключах словаря строки, состоящие только из букв и цифр, то можете создавать словарь с помощью функции dict() следующим образом:
1 2 3 | >>> simple_dict = dict(string1="value1", string2=2, string3=3.0) >>> print simple_dict {'string2': 2, 'string3': 3.0, 'string1': 'value1'} |
Здесь при создании словаря ключам выступают строки, указанные без кавычек.
Другим способом является передача в функцию dict() списка, состоящего из пар ключ-значение, представленных в виде кортежей.
1 2 3 | >>> simple_dict = dict([("string1","value1"), ("string2",2), ("string3",3.0)]) >>> print simple_dict {'string2': 2, 'string3': 3.0, 'string1': 'value1'} |
Итак, резюмируем.
Списки удобны, если:
1. Вы оперируете со смешанным набором данных.
2. Ваши данные должны быть упорядочены.
3. Ваши данные могут изменяться.
4. Вы используете очереди или стеки.
Кортежи следует использовать, когда:
1. Данные не нужно изменять.
2. Производительность кода очень важна.
Словари незаменимы:
1. Данные представляемы в виде пар ключ-значение.
2. Вам необходим быстрый доступ к данным.
3. Данные изменяются.