Inicio > Inmersión en Python > El poder de la introspección > Filtrado de listas | << >> | ||||
diveintopython.org Python para programadores con experiencia |
Como ya sabe, Python tiene una potente capacidad para convertir una lista en otra por medio de las relaciones de listas. Esto puede combinarse con un mecanismo de filtrado en el que algunos elementos de la lista se utilicen mientras otros se pasen por alto.
Ejemplo 2.13. 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 la relación de listas que usted conoce y tanto le gusta. 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 pasan por el proceso de relación y no se incluyen en la lista final.
Ejemplo 2.14. Presentación del filtrado de listas
>>> 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']
Ejemplo 2.15. Filtrado de una lista en 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; devuelve el valor de cada elemento. dir(object) devuelve la lista de los atributos y métodos de object; esa es la lista a 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, y 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 llamado, como lo serán los métodos y funciones, tanto incorporados (como el método pop de una lista) como definidos por el usuario (como la función buildConnectionString del módulo odbchelper). No nos interesan otros atributos, como el atributo __name__ que está incorporado en todos los módulos.
Lecturas complementarias
Obtención de referencias a objetos con getattr | 1 2 3 4 5 6 7 8 9 | La peculiar naturaleza de and y or |