Саммерфилд - Программирование на Python 3 (1077331), страница 32
Текст из файла (страница 32)
Множества также могут использоваться для удаления требуемых элементов. Например, если представить, что у нас имеется список имен файлов и нам необходимо исключить из него файлы с инструкциями по сборке (возможно, по той простой причине, что они генерируются автоматически, а не создаются вручную), мы могли бы использовать следующий прием: гв1епавея = яег(г(1епавея) Гог ваКеев1е ш ("МАКЕЕ1(Е", "МаКее11е", "ваКеГ11а"): Г11епавеяннясагп(ваКеев1е) Этот фрагмент удалит все ша)се11)е, присутствующие в списке, имена которых следуют стандарту использования заглавных символов, Этот фрагмент ничего не будет делать, если в списке отсутствуют искомые файлы. То же самое может быть реализовано в одной строке программного кода при помощи оператора получения разности множеств (-): 111епавея = яе1(ег1епавея) - ("МАКЕЕ1СЕ", "МаКеГ~1е", "ваКеГ11е") Кроме того, мы могли бы удалить элементы с помощью метода яес.
гевове(), хотя этот метод возбуждает исключение КеуЕггог, если удаляемый элемент отсутствует во множестве. Генераторы множеств В дополнение к возможности создавать множества с помощью функции яе1() или литералов, существует возможность создавать множества с помощью генераторов множеств.
Генератор множества — это выражение и цикл с необязательным условием, заключенные в фигурные скобки. Подобно генераторам списков, генераторы множеств поддерживают две формы записи: Глава 3. Типы коллекций !ехргеаюоп гог Ыеа !п >Гега01е) (ехргевв!оп гог !геа 1п !сегал)е 1! оопп!!!оп) Мы могли бы использовать генераторы множеств для фильтрации нежелательных элементов (когда порядок следования элементов не имеет значения), как показано ниже: та1 = (х !сг х 1П !11ев !! х.)оаег().епйва11П((". Пга", ". Пга1"))) Если предположить, что Т!1еэ — это список имен файлов, то данный генератор множества создает множество П(а1, в котором хранятся только имена файлов с расширениями .лгт и .Ит), независимо от регистра символов. Как и в случае с генераторами списков, в генераторах множеств используются итерируемые объеты, которые в свою очередь могут быть генераторами множеств (или генераторами любого другого типа), что позволяет создавать весьма замысловатые генераторы множеств.
ТИП ФГОгЕПбЕ1 Фиксированное множество (Ггагепве1) — это множество, которое после создания невозможно изменить. Хотя при этом мы, конечно, можем повторно связать переменную, которая ссылалась на фиксированное множество, с чемто другим. Фиксированные множества могут создаваться только в результате обращения к имени типа Г готепвег как к функции. При вызове Ггогепвег() без аргументов возвращается пустое фиксированное множество; с аргументом типа Тгогепвв! возвращается поверхностная копия аргумента; если аргумент имеет другой тип, выполняется попытка преобразовать его в объект типа 1гогепвес.
Эта функция принимает не более одного аргумента. Поскольку фиксированные множества относятся к категории неизменяемых объектов, они поддерживают только те методы и операторы, которые воспроизводят результат, не оказывая воздействия на фиксированное множество или на множества, к которым они применяются. В табл. 3.2 (на стр. 147) перечислены все методы множеств из которых фиксированными множествами поддерживаются: !готепве1.
сору(), )голвпве1.с!!Гегепсе() (-), Гготепве1. !п1егвес1!оп() ())), Гголепве1, !вс!в)о!пг(), !говепве1.!ввоьвег() (<= и < для выявления подмножеств), !гсхепввг.!ввирегве1() (>= и > для выявления надмножеств), Ггсгепве1. ип!оп() ()) и ггогепвег. зуаве)г!с О!)1егепсе() ( ), — то есть все те, что помечены в таблице знаком сноски ". Если двухместный оператор применяется ко множеству и фиксированному множеству, тип результата будет совпадать с типом операнда, стоящего слева от оператора. То есть если предположить, что à — это фиксированное множество, а в — зто обычное множество, то выражение ! 6 в вернет объект типа Гговвпвег, а выражение в а ! — объект ти- Отображения па ае!. В случае операторов == и! = порядок операндов не имеет значения, и выражение Г == з вернет Тгое, только если оба множества содержат одни и те же элементы.
Другое следствие неизменности фиксированных множеств заключается в том, что они соответствуют критерию хеширования, предъявляемому к элементам множеств, и потому множества и фиксированные множества могут содержать другие фиксированные множества. В следующем разделе, а также в упражнениях в конце главы мы ветретим множество примеров использования множеств.
Отображения Отображениями называются типы данных, поддерживающие оператор проверки на вхождение (ш), функцию 1еп() и возможность обхода элементов в цикле. Отображения — это коллекции пар элементов «ключ-значение», которые предоставляют методы доступа к элементам и их ключам и значениям. При выполнении итераций порядок следования элементов отображений может быть произвольным. В языке Ру!)топ имеется два типа отображений: встроенный тип атс! и тип со11ест!опа.
Зеуаа1тс!ст, определяемый в стандартной библиотеке. Мы будем испольэовать термин словарь для ссылки на любой из этих типов, когда различия между ними не будут иметь никакого значения. В качестве ключей словарей могут использоваться тольХешируемые ко хешируемые объекты, поэтому в качестве ключей еаее„те, словаря такие неизменяемые типы, как Г1оат, Ггоаепает, стр.!45 !пт, а! г и тар1е, использовать допускается, а изменяемые типы, такие как атс !, 1 та! и ает, — нет. С другой стороны, каждому ключу соответствует некоторое значение, которое может быть ссылкой на объект любого типа, включая числа, строки, списки, множества, словари, функции и т. д. Словари могут сравниваться с помощью стандартных операторов сравнения («, =, ==,!=, » ), при этом сравнивание производится поэлементно (и рекурсивно, при наличии вложенных элементов, таких как кортежи или словари в словарях).
Пожалуй, единственными операторами сравнения, применение которых к словарям имеет смысл, являются операторы == и! =. Словари Тип йтс! — это неупорядоченная коллекция из нуля или более пар «ключ-значение», в которых в качестве ключей могут использоваться ссылки на хешируемые объекты, а в качестве значений — ссылки на объекты любого типа. Словари относятся к категории изменяемых типов, поэтому легко можно добавлять и удалять их элементы, но так Глава 3. Типы коллекций Тип данных стет может вызываться как функция 0101( )— без аргументов она возвращает пустой словарь; если в качестве аргумента передается отображение, возвращается словарь, основанный на этом отображении: например, с аргументом типа т)ас1 возвращается поверхностная копия словаря.
Существует возможность передавать в качестве аргумента последовательности, если каждый элемент последовательности в свою очередь является последовательностью из двух объектов, первый из которых используется в качестве ключа, а второй — в качестве значения. Как вариант, для создания словарей, в которых ключи являются допустимыми идентификаторами языка Ру$)топ, можно использовать именованные аргументы; тогда имена аргументов будут играть роль ключей, а значения аргументов — роль значений ключей.
Кроме того, словари могут создаваться с помощью фигурных скобок — пустые скобки () создадут пустой словарь. Непустые фигурные скобки должны содержать один или более элементов, разделенных запятыми, каждый из которых состоит из ключа, символа двоеточия и значения. Еще один способ создания словарей заключается в использовании генераторов словарей — эта тема будет рассматриваться ниже, в соответствующем подразделе. о Именованные аргументы, стр. 206 о Генераторы словарей, стр.
160 ятся несколько способов создания словарей — все они соз- от же словарь: Ниже привод дают один и т о1 = отст(("то": 1948, "пане": "иавпег', "втае": 3)) 02 = отсс(то=1948, памеы'иавпег", в)ае=3) 03 = отст((("то", 1948), ("пане", "иавпег"), ("ваке", 3))) О4 = Отсс(а!р(("тп", "папе", "вые"), (1948, "Иавнег", 3))) О5 = ("тс": 1948, "пане": "Иавнег", "стае": 3) Словарь 61 создается с помощью литерала словаря.
Словарь о2 создается с помощью именованных аргументов. Словари 03 и 04 создаются из последовательностей, а словарь 05 создается из литерала словаря. Встроенная функция атр(), использованная при создании словаря 64, возвращает список кортежей, первый из которых содержит первые элементы всех итерируемых аргументов функции ыр(), второй — вторые элементы и т. д.
Синтаксис, основанный на применении именованных аргументов (использованный при создании словаря 02), обычно является наиболее компактным и удобным, но при этом ключами могут быть только допустимые идентификаторы. о Функция а1р(), стр. 169 как они являются неупорядоченными коллекциями, к ним не приме- нимо понятие индекса и не применима операция извлечения среза. Глава 3. Типы коллекций Таблица З.З. Методы словарей Синтаксис Описание 0.с1еаг() 0 сору() Возвращает словарь типа 01сс, ключами которого являются элементы последовательности в, а значениями либо лопе, либо и, если аргумент и определен 0.(гоикеув( в, ч) Возвращает значение ключа К или лопе, если ключ К отсутствует в словаре Возвращает значение ключа к или ч, если ключ к отсутствует в словире Возвращает представление' всех пар (ключ, значение) в словаре 0 Возвращает представление всех ключей словаря а Возвращает значение ключа К и удаляет из словаря элемент с ключом К или возбуждает исключение КеуЕггог, если ключ К отсутствует в словаре Возвращает значение ключа К и удаляет из словаря элемент с ключом К или возвращает значение ч, если ключ К отсутствует в словаре а.рор(К, ч) Возвращает и удаляет произвольную пару (ключ, значение) из словаря 0 или возбуждает исключение КеуЕггог, если словарь 0 пуст а.рор1теа() а.веыегвч11( То же, что и атст.оет() за исключением того, что, если ключ к К, и) в словаре отсутствует, в словарь вставляется новый элемент с ключом К и со значением лопе или и, если аргумент ч задан Добавляет в словарь 0 пары (ключ, значение) из а, которые отсутствуют в словаре 0, а для каждого ключа, который уже присутствует в словаре О, выполняется замена соответствующим значением из а; а может быть словарем, итерируемым объектом с парами (ключ, значение) или именованными аргументами а.ораате(а) Возвращает представление' всех значений в словаре 0 а.ча1оев() Представления словарей можно трактовать и использовать как итерируе- мые объекты.