Начало > В глубь языка Python > Сила самоанализа > Фильтрование списков | << >> | ||||
В глубь языка Python Для программистов |
Как вы уже знаете, Python позволяет преобразовывать списки с помощью расширенной записи. Такой подход можно комбинировать с фильтрованием, когда некоторые элементы отображаются, в то время как другие пропускаются.
Пример 2.13. Синтаксис фильтрования списков
[mapping-expression for element in source-list if filter-expression]
Это дополнительная возможность в расширенной записи списков, которую вы обязательно полюбите. Начало расширенной записи остается прежним, а в конце, начиная с if, добавляется условие, по которому будет производиться фильтрование. Условие может быть любым выражением, которое дает истину или ложь (в Python это может быть практически любым выражением). Любой элемент, для которого условие дает истину, будет участвовать в отображении. Все остальные элементы игнорируются, то есть в выражение отображения не подставляются и в результат не включаются.
Пример 2.14. Введение в фильтрование списков
>>> li = ["a", "mpilgrim", "foo", "b", "c", "b", "d", "d"]
>>> [elem for elem in li if len(elem) > 1]
['mpilgrim', 'foo']
>>> [elem for elem in li if elem != "b"]
['a', 'mpilgrim', 'foo', 'c', 'd', 'd']
>>> [elem for elem in li if li.count(elem) == 1]
['a', 'mpilgrim', 'foo', 'c']
Пример 2.15. Фильтрование списка в apihelper.py
methodList = [method for method in dir(object) if callable(getattr(object, method))]
Этот пример выглядит сложным, но основная структура остается прежней. Все выражение дает список, который присваивается переменной methodList. Выражение отображения простое: оно дает значение каждого элемента. Функция dir(object) возвращает список всех атрибутов и методов объекта object — это тот список, который мы преобразуем. И единственная новая часть — это условие фильтра после if.
Выражение фильтра выглядит жутко, но он таковым не является. Вы уже знаете о callable, getattr и in. Как вы могли видеть в предыдущем разделе, выражение getattr(object, method) дает объект-функцию, если object является модулем и method содержит имя функции из этого модуля.
Таким образом, мы берем объект object, получаем список имен его атрибутов, методов, функций, и затем фильтруем этот список, избавляясь от всего, что нас не интересует. Для того, чтобы избавиться от ненужного, мы берем имя каждого атрибута/метода/функции, с помощью функции getattr получаем настоящий объект. Затем мы проверяем, поддерживает ли объект вызов, таким образом подхватывая все функции и методы — как встроенные (например, метод pop списков), так и определенные пользователем (например, функция buildConnectionString в модуле odbchelper). Нас не интересуют другие атрибуты, такие как обязательный для всех моделей атрибут __name__.
Дополнительная литература
Получение атрибутов с помощью getattr | 1 2 3 4 5 6 7 8 9 | Особенности операторов and и or |
Copyright © 2000, 2001, 2002 Марк Пилгрим Copyright © 2001, 2002 Перевод, Денис Откидач |