Лутц М. - Изучаем Python (1077325), страница 49
Текст из файла (страница 49)
Коли вы написали инструкцию вроде 'с='с. аррепб(Х), вы не получите измененное значение с (в действительности вы совсем потеряете ссылку на список) — использование таких атрибутов, как аррепб и эогт приводит к изменению самого объекта, поэтому нет никаких причин выполнять повторное присваивание. Как и строки, списки обладают рядом других методов, выполняющих специализированные операции.
Например, метод гвчегве изменяет порядок следования элементов в списке на обратный, а методы ехтепб и рор вставляют несколько элементов в конец списка и удаляют элементы из конца списка, соответственно: »>к=[1, 21 »> ц ехтепб([3,4,5]) № добавление нескольких элементов в конец списка »> [1, 2, 3, 4, 5] »> с.рор() № Удаляет и возвращает последний элемент списка 5 »> с [1, 2, 3, 4] »> с, гечегве[) >» [4, 3, 2, 1] В некоторых типах программ метод рор, показанный здесь, часто ис- пользуется в паре с методом вррвпб для реализации структур данных ти- па стек — »последний пришел, первый ушел» (Ьавь-1п-г)гв(-Оиь, 1дг О).
Конец списка служит вершиной стека: № Втолкнуть на стек № Внтолкнуть со стека Хотя это здесь и не показано, тем не менее, метод рор может принимать необязательное смещение элемента, который удаляется из списка и возвращается (по умолчанию это последний элемент). Другие методы списков позволяют удалять элементы с определенными значениями (гевоче), вставлять элементы в определенную позицию ([пвегт), отыскивать смещение элемента по заданному значению (1пбвх) и т.
д. Чтобы поближе познакомиться с этими методами, обратитесь к имеющимся источникам документации или поэкспериментируйте с этими методами в интерактивной оболочке интерпретатора. »> ь = [] »> ь.аррепб(1) »> ь.аррепб(2) »> [1, 2] »> с рор() 2 »> [1] № Изменяет порядок следования элеиентов на обратннй 224 Глава 8.
Списки и словари Прочие часто используемые операции над списками Так как списки относятся к категории изменяемых объектов, вы мо- жете использовать инструкцию бе1 для удаления элемента или среза непосредственно из списка: »> ['ЯРАМ! ', 'еаг', 'аоге', 'р1еаае'] »> бе1 1[0] № Удаление одного элеиента списка »> ['еаг', 'аоге', 'р1еаае'] »> бе1 1[Ги] >» ['еаг'] № Удаление целого сегиента списка № То ие, нто и 1( П ] = 1] Так как операция присваивания срезу выполняется как удаление и вставка, можно удалять срезы списка, присваивая им пустой список ([[1: ] ]=[]) — интерпретатор сначала удалит срез, определяемый слева от оператора =, а затем вставит пустой список.
С другой стороны, присваивание пустого списка по индексу элемента приведет к сохранению ссылки на пустой список в этом элементе, а не к его удалению: »> 1 = ['А1геабу', 'зот', 'опе'] »> Цти] = [] »> ['А1геабу'] »> 1[0] = [] »> [[]] Словари После списков словари являются, пожалуй, самым гибким из встроенных типов данных в языке Ру1]гоп. Если считать списки упорядоченными коллекциями объектов, то в отличие от них элементы в слова- Все только что рассмотренные операции используются достаточно часто, однако существуют и другие дополнительные методы и операции для списков, которые не были показаны здесь (включая методы вставки и поиска). Чтобы получить полный список существующих дополнительных операций, всегда следует обращаться к руководствам по языку РуФоп, к функциям б1г и Пе1р (с которыми мы впервые позна.
комились в главе 4) или к книге «Ру[]гоп Рос]сеФ КеГегепсе» (О'Ке111у) и другим справочным руководствам, упоминавшимся в предисловии. Кроме того, я хотел бы напомнить, что все операции непосредственного изменения объектов, обсуждавшиеся здесь, применимы только к изменяемым объектам: они не будут работать со строками (или с кортежами, которые рассматриваются в следующей главе) независимо от прикладываемых вами усилий.
Изменяемость или неизменяемость— это исходное свойство, присущее каждому типу объектов. Словари йгб рях сохраняются и извлекаются с помощью ключа, а не с помощью смещения, определяющего их позицию. Будучи встроенным типом данных, словари могут заменить множество алгоритмов поиска и структур данных, которые приходится реализовывать вручную в низкоуровневых языках программирования,— доступ к элементам словаря по их индексам представляет собой быструю операцию поиска. Кроме того, иногда словари могут играть роль записей и таблиц символов, используемых в других языках, и способны служить для представления разреженных (по большей части пустых) структур данных. Ниже приводятся основные характеристики словарей в языке РуФпоп: Доступ к элементам по ключу, а не по индексу Иногда словари называют ассоциативными массивами, или хеша.
ми. Они определяют взаимосвязь между значениями и ключами, поэтому для извлечения элементов словаря можно использовать ключи, под которыми эти элементы были сохранены в словаре. Для получения элементов словаря используется та же самая операция доступа по индексу, как и в списке, только индекс приобретает форму ключа, а не смещения относительно начала. Неупорядоченные коллекции произвольных объектов В отличие от списков, элементы словарей хранятся в неопределенном порядке.
В действительности, интерпретатор вносит элемент случайности в порядок следования элементов для обеспечения более быстрого поиска. Ключи описывают символическое (не физическое) местоположение элементов в словаре. Неременнал длина, гетерогенность и произвольное число уровней вложенности Подобно спискам словари могут увеличиваться и уменьшаться непосредственно (то есть при этом не создаются новые копии). Они могут содержать объекты любых типов и поддерживают возможность создания произвольного числа уровней вложенности (они могут содержать списки, другие словари и т. д.). Относятся к категории изменяемых отображений Словари могут изменяться непосредственно с использованием операции индексирования (они являются изменяемыми), но они не поддерживают операции над последовательностями, которые поддерживаются строками и списками.
Словари представляют собой неупорядоченные коллекции, поэтому операции, которые основаны на использовании фиксированного порядка следования элементов (например, конкатенация, извлечение среза), не имеют смысла для словарей. Словари — это единственный встроенный представитель объектов-отображений (объекты, которые отображают ключи на значения). 22б Глава 8. Списки и словари Таблица 8.2. Литералы словарей и операции Операция 01=() Р2 = ('враз' 2, 'еддв': 3) 03 = ('горо': ('Паз': 1, 'Едд': 2)) Интерпретация Пустой словарь Словарь нз двух элементов Вложение Доступ к элементу по ключу 02['еддв'] 03['гоос']['пав'] Методы: проверка на вхождение, спи- сок ключей, список значений, копиро- вание, получение значения по умолча- нию, слияние, удаление н т.
д. 02.пав кеу('еддв') 'еддв' ш 02 02.Кеув() 02.уа1пев() 02,сору() Рд.дег(хеу, Ьесап11) 02.прсаге(01) 02.рор(кеу) Длина (количество элементов) 1еп(Р1) Как н в случае со списками, вам нечасто придется встречать словари, сконструированные с использованием литералов. Однако списки н словари увеличиваются в размерах по-разному. Как будет показано в следующем разделе, словари обычно дополняются с помощью операции присваивания по новым ключам во время выполнения программы — такой подход совершенно не годится для списков (спнскн обычно расширяются с помощью мегода аррепс). Таблицы ссылок иа объекты (хеш-таблицы) Если списки — это массивы ссылок на объекты, которые поддерживают возможность доступа к элементам по их позициям, то словари— это неупорядоченные таблицы ссылок на объекты, которые поддерживают доступ к элементам по ключу.
Внутри словари реализованы как хеш-таблицы (структуры данных, которые обеспечивают очень высокую скорость поиска), изначально небольшого размера и увеличивающиеся по мере необходимости. Более того, интерпретатор Ру$йоп использует оптимизированные алгоритмы хеширования для обеспечения максимально высокой скорости поиска ключей. Подобно спискам словари хранят ссылки на объекты (а не их копии).
В табл. 8.2 приводятся некоторые наиболее часто используемые операции над словарями (опять же, чтобы получить полный перечень операций, обращайтесь к руководству или воспользуйтесь функцией б[г(0101) или ле1р(0101), где о101 — это имя типа). при определении ввиде литералов словари записываются как последовательность пар Кеу: уа1ое, разделенных запятыми, заключенных в фигурные скобки.' Пустой словарь в литеральном представлении — это пустая пара скобок. Словари могут вкладываться в литеральном представлении в виде значений внутри других словарей, списков или кортежей. Словари в действии Словари вдействии Согласно табл.