Лутц М. - Изучаем Python (1077325), страница 50
Текст из файла (страница 50)
8.2 доступ к элементам словарей осуществляется по ключу, а для доступа к элементам вложенных словарей осуществляется путем объединения серии индексов (ключей в квадратных скобках) в цепочку. Когда интерпретатор создает словарь, он сохраняет элементы в произвольном порядке — чтобы получить значение обратно, необходимо указать ключ, с которым это значение было ассоциировано.
Давайте вернемся в интерактивный сеанс работы с интерпретатором и исследуем некоторые операции над словарями из табл. 8.2. Базовые операции над словарями В обычном случае сначала создается словарь, а затем выполняются операции сохранения новых ключей и обращения к элементам по ключу: Ь рутавп »> б2 = ('враа': 2, 'паа': 1, 'еррв': 3) в Создание словаря »> б2('враз') В Извлечение значения по ключу 2 »> б2 В Случайний порядок следования ('еров': 3, 'пав': 1, 'враз': 2) Здесь переменной б2 присваивается словарь, в котором ключу 'враз' соответствует целочисленное значение 2, и т. д.
Для доступа к элементам словаря используется тот же самый синтаксис с квадратными скобками, что и при извлечении элементов списков, но в данном случае доступ осуществляется по ключу, а не по позиции элемента. Обратите внимание на последнюю инструкцию в этом примере: порядок следования ключей в словари практически всегда отличается от первоначального.
Дело в том, что для обеспечения максимально высокой скорости поиска по ключу (для хеширования) необходимо случайное расположение ключей в памяти. Именно поэтому операции, которые предполагают наличие установленного порядка следования элементов слева направо (например, извлечение среза, конкатенация), неприменимы к словарям — они позволяют извлекать значения только по ключам, а не по индексам. Встроенная функция )ел может работать и со словарями — она возвращает число элементов в словаре или, что то же самое, длину списка ключей.
Метод словаря лаз 'иеу и оператор проверки вхождения тп ггв Глава 8. Списки и словари позволяют проверить наличие ключа, а метод Кеуа возвращает все ключи, имеющиеся в словаре, в виде списка. Последний удобно использовать для последовательной обработки словарей, но при этом вы не должны делать какие-либо предположения о порядке следования ключей в списке. Поскольку результатом вызова метода Кеуа является список, он всегда может быть отсортирован: >» )вп(б2) 3 »> б2.пав Кеу( Тпие »> 'Паа' 1п б2 Тгпе »> б2.кеув() ~'ерзэ', 'паа', № Число элеиентоа словари Пав') № Проверка на вхокдение № Проверка на ехокдение, альтернативной способ № Соэдает новей список ключей враа'] Изменениесловарей Давайте продолжим работу в интерактивном сеансе. Словари, как и списки, относятся к категории изменяемых объектов, поэтому их можно изменять, увеличивать, уменьшать непосредственно, не создавая новые словари: чтобы изменить или создать новую запись в словаре, достаточно выполнить операцию присваивания по ключу.
Здесь также применима инструкция бе] — она удаляет значение, связанное с ключом, который играет роль индекса. Обратите также внимание иа Обратите внимание на третье выражение в этом листинге. Как уже упоминалось ранее, оператор проверки на вхождение 1п может использоваться для работы со строками и списками, но точно так же он может использоваться и для работы со словарями. Он проверяет наличие указанного ключа в словаре точно так же, как и метод Паз Кеу строкой выше. Это возможно благодаря тому, что словари определяют итера- торы, которые обеспечивают пошаговый обход списков ключей.
Существуют и другие типы, которые поддерживают итераторы, отвечающие обычному использованию типа; например, файлы имеют итераторы, которые позволяют выполнять построчное чтение данных. Итера- торы будут рассматриваться в главах 17 и 24. Далее в этой главе и в книге вы узнаете о двух альтернативных способах создания словарей, которые демонстрируются в конце табл. 8.2: можно передать функции бтсс (которая фактически является конструктором типа) упакованные списки ключей/значений в виде кортежей или значения в виде именованных аргументов. Передача значений в виде именованных аргументов будет рассматриваться в главе 16.
Использование функции 2)р, которая представляет собой способ конструирования словарей из списков ключей и значений, будет рассматриваться в главе 18. Если заранее невозможно предугадать, какие ключи и значения будут получаться во время работы программы, вы всегда сможете создавать их динамически в виде списков и затем упаковывать функцией 21р. 229 Словари е действии »> в2['паа') = ('цг1п', 'ьаке', 'угу') № изиенение злеиента »> В2 ('еддв': 3, 'врав' 2, 'Паа': ['дг>11'. 'ЬаКе', 'Ггу']1 »> Ве1 02['вЦЦв') № удаление злеиента »> О2 ('зрав'; 2, 'паа': ['цг>11', 'ьаке'.
'(гу']) »> В2('Ьгопсл') = 'Васоп' № добавление нового злеиента »> В2 ('Ьгспсл'; 'Васоп', 'врав': 2, 'Паа ['цг111', 'ЬаКе', 'Ггу')) Как и в случае со списками, в словаре операция присваивания по существующему индексу приводит к изменению ассоциированного с ним значения.
Однако в отличие от списков, словари допускают выполнение присваивания по новому ключу (который ранее отсутствовал), в результате создается новый элемент словаря, как показано в предыдущем примере для ключа 'Ьгьпсп'. Этот прием не может применяться к спискам, потому что в этом случае интерпретатор обнаруживает выход за пределы списка и генерирует сообщение об ошибке. Чтобы увеличить размер списка, необходимо использовать такие средства списков, как метод аррепб или присваивание срезу.
Дополнительные методы словарей Методы словарей обеспечивают выполнение различных операций. на- пример, методы словарей ча1оез и 1(еаз возвращают список значений элементов словаря и кортежи пар (Кеу, ча1ое), соответственно: »> В2 = ('враз': 2, 'Ьав': 1, 'вддв': 3) »> О2. ча1свв() [3, 1, 2] »> 02.1тввв() [( еддз', 3), ('Паа', 1), ('зраа'. 2)] Такие списки удобно использовать в циклах, когда необходимо выполнить обход элементов словаря. Попытка извлечения несуществующего элемента словаря обычно приводит к появлению отпибки, однако метод дет в таких случаях возвращает значение по умолчанию (Коле или указанное значение).
С помощью этого метода легко можно реализовать получение значений по умолчанию и избежать появления ошибки обращения к несуществующему ключу: »> В2.двС('враз') 2 »> В2,дет('товвт') Коле »> В2.цет('тоавт', 88) 88 № Ключ присутствует в словаре № Ключ отсутствует е словаре наличие вложенного списка в следующем примере (значение для клю- ча 'Паа'). Все типы-коллекции в языке Ру$]топ могут вкладываться друг в друга в произвольном порядке: 2ЗО Глава 8. Списки и словари Метод орбате реализует своего рода операцию конкатенации для слова- рей. Он объединяет ключи и значения одного словаря с ключами и значениями другого, просто перезаписывая значения с одинаковы- ми ключами: »> б2 ('еддз': 3, 'Пав': 1, 'зрав': 2) »> бз = ('тоазт':4, 'вотт)п ",5) »> б2.арбате(бз) »> б2 ('тоаы ': 4, 'витт(п': 5, 'еддз': 3, 'пав': 1, 'зрав': 2) Наконец, метод рор удаляет ключ из словаря и возвращает его значе- ние.
Он напоминает метод рор списков, только вместо необязательного индекса элемента принимает ключ: в удаление элеиентов словаря по ключу »> б2 ('тоазт'; 4, 'вот(то': 5, 'еддз': 3, 'пав' 1, 'зрав'; 2) »> б2.рор('вцтт(п') 5 »> б2.рор('тоазс') а удаляет и возеравает значение заданного ключа 4 »> б2 ('еддз' 3, 'Пав': 1, 'зрав': 2) В удаление злеиентов списка по позиции »> Ь = ('аа', 'ЬЬ', 'сс', 'бб') »> ь.рор() а Удаляет и возвращает последний элеиент списка 'бб' »> ('аа', 'ЬЬ', 'сс') »> Ь,рор(1) 'ЬЬ' »> Ь ('аа', 'сс') а удаляет и еозврввает элемент из заданной позиции Кроме того, словари имеют метод сору, который мы рассмотрим в следующей главе, как один из способов избежать побочных эффектов, связанных с наличием нескольких ссылок на один и тот же словарь.
В действительности словари обладают гораздо большим числом методов, чем перечислено в табл. 8.2. Чтобы получить полный список, обращайтесь к руководствам по языку Ру1)топ. Таблица языков Давайте рассмотрим более жизненный пример словаря. В следующем примере создается таблица, которая отображает названия языков программирования (ключи) на имена их создателей (значения). С помощью этой таблицы можно по названию языка определить имя его создателя: 2зц Словари з действии »> гаые = ('Ругпоп': 'Оч1во чап ноззпв', 'Рег1': '[аггу Ва11', 'Тс)'. 'Зоьп Опзгеглопг' ) »> 1апцчаце = 'Ругьоп' »> сгеагог = гаЫе[1апцчаце) »> сгеагог 'Оы Со чап Ноззчп' »> 1ог 1апц 1п гаЫе.пеуп(): Рг1пг 1апц, ' гг', гаЫе[1апц) Тс1 Ооьп Очзгеглочг Ругпоп Очтоо чап ноезчп Рег1 гаггу Иа11 В последней команде использован оператор цикла 1о г, который мы еще подробно не рассматривали.
Для тех, кто не знаком с циклами 1ог, замечу, что приведенная команда просто выполняет обход всех ключей в таблице и выводит список ключей и их значений, разделенных символом табуляции. Подробно о циклах 1о г будет рассказываться в главе 13. Так как словари не являются последовательностями, их нельзя напрямую использовать в операторе цикла 1ог, как это допускают строки и списки. Но, если необходимо выполнить обход элементов словаря, это легко сделать с помощью метода Неуз, возвращающего список всех ключей словаря, который может использоваться для выполнения итераций в цикле 1ог. В случае необходимости внутри цикла можно получать значение элемента по его ключу, как это реализовано в данном примере.