Tengo varias listas que tienen el mismo número de entradas (cada una especifica una propiedad de objeto):
property_a = [545., 656., 5.4, 33.]
property_b = [ 1.2, 1.3, 2.3, 0.3]
...
y lista con banderas de la misma longitud
good_objects = [True, False, False, True]
(que podría sustituirse fácilmente con una lista de índice equivalente:
good_indices = [0, 3]
¿Cuál es la forma más sencilla de generar nuevas listas property_asel
, property_bsel
, ..., que contienen sólo los valores indicados, ya sea por las True
entradas o los índices?
property_asel = [545., 33.]
property_bsel = [ 1.2, 0.3]
zip
en Python 2 creará una nueva lista, pero en Python 3 simplemente devolverá un generador (perezoso).from itertools import izip
y usarlo en lugar dezip
en el primer ejemplo. Eso crea un iterador, igual que Python 3.Veo 2 opciones.
Usando numpy:
Usando una lista de comprensión y comprímala:
fuente
[property_b[i] for i in good_indices]
es bueno para usar sinnumpy
Utilice la función zip incorporada
EDITAR
Solo mirando las nuevas características de 2.7. Ahora hay una función en el módulo itertools que es similar al código anterior.
http://docs.python.org/library/itertools.html#itertools.compress
fuente
itertools.compress
here. La comprensión de la lista es mucho más legible, sin tener que desenterrar lo que está haciendo la compresión.Suponiendo que solo tiene la lista de elementos y una lista de índices verdaderos / requeridos, este debería ser el más rápido:
Esto significa que la selección de propiedades solo hará tantas rondas como índices verdaderos / requeridos. Si tiene muchas listas de propiedades que siguen las reglas de una sola lista de etiquetas (verdadero / falso), puede crear una lista de índices utilizando los mismos principios de comprensión de listas:
Esto itera a través de cada elemento en good_objects (mientras recuerda su índice con enumerate) y devuelve solo los índices donde el elemento es verdadero.
Para cualquiera que no obtenga la comprensión de la lista, aquí hay una versión en prosa en inglés con el código resaltado en negrita:
enumere el índice para cada grupo de índice, elemento que existe en una enumeración de buenos objetos , si (donde) el elemento es Verdadero
fuente
Los lenguajes Matlab y Scilab ofrecen una sintaxis más simple y elegante que Python para la pregunta que está haciendo, así que creo que lo mejor que puede hacer es imitar Matlab / Scilab usando el paquete Numpy en Python. Al hacer esto, la solución a su problema es muy concisa y elegante:
Numpy intenta imitar a Matlab / Scilab, pero tiene un costo: debes declarar cada lista con la palabra clave "matriz", algo que sobrecargará tu script (este problema no existe con Matlab / Scilab). Tenga en cuenta que esta solución está restringida a matrices de números, que es el caso de su ejemplo.
fuente
filter
la biblioteca integrada o externa de Pythonpandas
. Si va a intercambiar idiomas, también puede probar R, pero eso no es lo que pregunta la pregunta .