| You are here: Inicio > Inmersión en Python > El poder de la introspección > Filtrado de listas | << >> | ||||
Inmersión en PythonPython de novato a experto |
|||||
Como ya sabe, Python tiene potentes capacidades para convertir una lista en otra por medio de las listas por comprensión (Sección 3.6, “Inyección de listas (mapping)”). Esto puede combinarse con un mecanismo de filtrado en el que se van a tomar algunos elementos de la lista mientras otros se pasan por alto.
Ésta es la sintaxis del filtrado de listas:
[expresión de relación for elemento in lista origen if expresión de filtrado]
Esto es una extensión de las listas por comprensión que usted conoce y que tanto le gustan. Las dos primeras partes son como antes; la última parte, la que comienza con if, es la expresión de filtrado. Una expresión de filtrado puede ser cualquier expresión que se evalúe como verdadera o falsa (lo cual, en Python, puede ser casi cualquier resultado). Cualquier elemento para el cual la expresión resulte verdadera, será incluido en el proceso de relación. Todos los demás elementos se pasan por alto, de modo que no entran en el proceso de relación y no se incluyen en la lista de salida.
>>> 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']
Volvamos a esta línea de apihelper.py:
methodList = [method for method in dir(object) \
if callable(getattr(object, method))]Esto parece complicado, y lo es, pero la estructura básica es la misma. La expresión de filtrado devuelve una lista, que se asigna a la variable methodList. La primera mitad de la expresión es la parte de relación. Es una relación de identidad, que devuelve el valor de cada elemento. dir(object) devuelve una lista de los atributos y métodos de object; ésa es la lista a la que se aplica la relación. Luego la única parte nueva es la expresión de filtrado que sigue a if.
La expresión de filtrado parece que asusta, pero no. Usted ya conoce callable, getattr e in. Como se vio en la sección anterior, la expresión getattr(object, method) devuelve un objeto función si object es un módulo y method el nombre de una función de ese módulo.
Por tanto esta expresión toma un objeto (llamado object). Obtiene la lista de sus atributos, métodos, funciones y algunas cosas más. A continuación filtra esta lista para eliminar todo lo que no nos interesa. Esto lo hacemos tomando el nombre de cada atributo/método/función y obteniendo una referencia al objeto real por medio de la función getattr. Después comprobamos si ese objeto puede ser invocado, que será el caso de los métodos y funciones, tanto incorporados (como el método pop de una lista) como definidos por el usuario (igual que la función buildConnectionString del módulo odbchelper). No nos interesan otros atributos, como el __name__ que está incorporado en todos los módulos.
<< Obtención de referencias a objetos con getattr |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
La peculiar naturaleza de and y or >> |