Лутц М. - Изучаем Python (1077325), страница 51
Текст из файла (страница 51)
Кроме того, Ру(Поп в действительности позволяет выполнять обход списка ключей словаря и без вызова метода Неуз в операторе цикла 1о г. Для любого словаря 0 цикл можно оформить как 1ог Неу 1л О:, что равносильно полной форме записи 1ог Неу гп О. Неуэ():. Это всего лишь еще одна разновидность итераторов, упоминавшихся ранее, которая позволяет использовать оператор проверки вхождения г п со словарями (подробнее об итераторах далее в книге).
Замечания по использованию словарей Словари окажутся достаточно просты в использовании, когда вы освоите работу с ними, но я хочу привести несколько соображений, которые вам следует твердо знать: ° Операции над последовательностями неприменимы и словарям. Словари — это отображения, а не последовательности. Вследствие того, что словари не предусматривают никакого упорядочения элементов, такие операции, как конкатенация (упорядоченное объединение) и извлечение среза (извлечение непрерывного блока элементов), просто неприменимы. В действительности, когда в программном коде во время выполнения производится попытка сделать нечто подобное, интерпретатор выдает сообщение об ошибке.
Глава 8. Списки и словари ° Присваивание по несуществующему индексу приводит к созданию нового элемента. Ключи можно создавать при определении словаря в виде литерала (в этом случае они встраиваются непосредственно в литерал) или при присваивании значения новому ключу существующего объекта словаря. Результат получается тот же самый. ° Ключи не обязательно должны бьппь строками.
В наших примерах в качестве ключей использовались строки, но могут использоваться любые другие неизменяемые объекты (то есть не списки). Например, в качестве ключей допустимо использовать целые числа, что превращает словарь в подобие списка (как минимум, в смысле индексирования). В качестве ключей можно также использовать кортежи, что позволяет создавать составные ключи. Экземпляры классов (обсуждаются в четвертой части книги) также могут играть роль ключей при условии, что они поддерживают определенные методы, которые сообщат интерпретатору, что он имеет дело с неизменяемым объектом, в противном случае они будут бесполезны, если рассматривать их как фиксированные ключи.
Использование словарей для имитации гибких списков Последнее замечание в предыдущем списке имеет настолько важное значение, что имеет смысл продемонстрировать его применение на нескольких примерах. Списки не допускают возможность присваивания по индексам, находящимся за пределами списков: »>[=[) »> [[99) = 'враз' Тгасеваох (аозт геоепт оа11 1азт); Е[1е "<в(Ого>", 1[не 1, тп > 1поехеггог. 11зт азюопеепт [поех оц1 от гапре (Перевод.
Диагностика (самого последнего вызова): Файл '<зто1п>", строка 1, позиция о !псехЕггог. присваивание по индексу за пределами списка) Можно, конечно, с помощью операции повторения создать список достаточно большой длины (например, (0]*100), но можно создать нечто, что напоминает словарь, который не требует такого выделения пространства. При использовании целочисленных ключей словари могут имитировать списки, которые увеличиваются при выполнении операции присваивания по смещению: »> 0 = () »> 0[99) = 'враз' »> 0[99) 'зраа' »> 0 (99: 'зраа') Результат выглядит так, как если бы 0 был списком из 100 элементов, но на самом деле — это словарь с единственным элементом — значением 2ЗЗ Словари в действии ключа 99 является строка ' зрав '.
В такой структуре можно обращаться по смещениям, как и в списке, но вам не требуется выделять пространство для всех позиций, которые могут когда-либо потребоваться при выполнении программы. При использовании подобным образом словари представляют собой более гибкие эквиваленты списков.
Использование словарей для структур разреженных данных Похожим образом словари могут использоваться для реализации структур разреженных данных, таких как многомерные массивы, где всего несколько элементов имеют определенные значения: »> МаСг1х = () »> Матг1х[(2, 3, 4)] -" 88 »> Матг1х[(7, 8, 9)] = 99 »> »>Х=2; У=З; 2=4 >» МаСг1х[(Х, У, 2)] 88 »> Матг1х ((2, 3, 4): 88. (7, 8, 9)' 99) а; отделяет инструкции Здесь словарь использован для представления трехмерного массива, в котором только два элемента, (2, 3, 4) и (7, 8, 9), имеют определенные значения.
Ключами словаря являются кортежи, определяющие координаты непустых элементов. Благодаря этому вместо трехмерной матрицы, объемной и по большей части пустой, оказалось достаточно использовать словарь из двух элементов. В такой ситуации попытка доступа к пустым элементам будет приводить к возбуждению исключения, так как эти элементы физически отсутствуют: »> Матгтх[(2,3.6)] тгасеьаск (Фозс гесепс са11 1азс): е>1е "<зсотп>", 1>пе ц сп > КеуЕггог: (2, 3, 6) (Перевод Диагностика (самого последнего вмзоаа). Файл '<зсссп>", строка 1, позиция > КеуЕггог: (2, 3, 6)) Как избежать появления ошибок обращения к несуществующему ключу Ошибки обращения к несуществующему ключу являются обычными при работе с разреженными матрицами, но едва ли кто-то захочет, чтобы они приводили к преждевременному завершению программы.
Существует, по крайней мере, три способа получить значение по умолчанию вместо возбуждения исключения — можно предварительно проверить наличие ключа с помощью условного оператора ст, воспользоваться конструкцией сгу, чтобы перехватить и явно обработать исключение, или просто использовать показанный ранее метод словаря 9ес, способный возвращать значение по умолчанию для несуществующих ключей: Глава 8. Списки и словари »> 1Г Иагг1х.паа Кву((2,3,6)): № Проварить наличие ключа перед обращенном рг1п( Иа(г1х((2,3,6)) а15в: рг1п( 0 О »> ггу: рг1п1 Иа1г1х((2,3,6)) ...
вхсар1 Каубггог: рг1п( 0 № Попытаться обратиться ло индвксу № Перехватить исключвнив и обработать О »> Иа(г1х.цвг((2,3,4), 0) бб »> Иагг1х, цв1((2, 3, б), 0) О № Сущвствувт; извлекается и возврвщввтся № Отсутствует; используется аргумент Овтви1Г Способ, основанный на применении метода цец является самым простым из приведенных, если оценивать объем программного кода, — инструкции 1( и 1 ту подробно будут рассматриваться далее в этой книге. »> гвс = () »> гвс('папа') = 'ав1' »> гвс('ацв') = 45 »> гвс(')оь') = 'гга1пвг/щг11вг' »> »> рг1п1 гас['папе') юв1 Встроенные типы языка Ру()(оп позволяют легко представлять структурированную информацию; это особенно заметно, когда появляются уровни вложенности.
В следующем примере снова используется словарь для хранения свойств объекта, но на этот раз заполнение производится в единственной инструкции (вместо того чтобы выполнять присваивание каждому ключу в отдельности), причем здесь присутствуют вложенные список и словарь, чтобы обеспечить представление структурированных свойств объекта: »> ав1 = (' папа'; 'Иагх', Использование словарей в качестве «записей» Как видите, словари в языке РуФ)гоп способны играть множество ролей.
Вообще говоря, они способны заменить реализацию алгоритмов поиска (потому что операция индексирования по ключу уже является операцией поиска), могут представлять самые разные типы структурированной информации. Например, словари представляют один из многих способов описания свойств элементов в программах, то есть они могут играть ту же роль, какую играют чструктурыь и «записи» в других языках программирования. В следующем примере выполняется заполнение словаря путем присваивания значений новым ключам в виде нескольких инструкций: Словари в действии Чоьа'; ['тга1пвг', 'иг1(вг'], 'ивЬ': 'иыи.гв1.пвт/ 1ота', 'вова'; ('агате", 'СО', 'а1Р':80513)) Чтобы извлечь компоненты вложенных объектов, достаточно просто объединить в цепочку операции индексирования: »> ввЦ 'пава'] 'Мага' »> ввЦ ']ова'] ['(та>пег', 'игттаг'] »> веЦ']ова'И1] 'ыгмвг' >» ввЦ'Ьоав']['№1Р'] 805)3 ( паюв': 'ае1', 'адв': 45) № Традиционное литеральное выраывнив 0=() О['паве'] = 'юв1' 0['аде'] = 45 № Динамическое присваиванию по клю~ам отст(паев='ае)', аде=45) № Фориа иивнованных аргументов Отст([('паве', 'юе1'), ('адв', 45)]) № Кортами ключ/значение Все четыре варианта создают один и тот же словарь, содержащий два элемента: ° Первый вариант удобен, если содержимое всего словаря известно заранее.
° Второй вариант удобно использовать, когда необходимо динамически создавать словарь по одному полю за раз. ° Третий вариант с использованием именованных аргументов даже компактнее, чем литералы, но он требует, чтобы все ключи были строками. ° Последний вариант удобен, когда ключи и значения во время выполнения программы необходимо хранить в виде последовательностей. Как было показано в конце табл.
8.2, последний вариант также часто используется в соединении с функцией г[р, которая позволяет объединить отдельные списки ключей и значений, создаваемые динамически во время выполнения (например, при извлечении данных из столбцов в файле). Другие способы создания словарей Наконец, обратите внимание, что благодаря практической ценности словарей с течением времени появились и другие способы их создания. В РуЫ>оп 2.8 и более поздних версиях, например, последние два вызова конструктора ([[с[ в следующем ниже примере имеют тот же эффект, что и литералы и форма присваивания по отдельным ключам в примере выше: Глава 8.