Lista de segmentos complejos / índice en python

Tengo una lista que se parece a esto:

lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 

Me gustaría generar una lista filtrada que se vea así:

 filtered_lst = [2, 6, 7, 9, 10, 13] 

Python proporciona una convención para el corte personalizado. Algo como:

 lst[1, 5, 6, 8, 9, 12] # slice a list by index 

Utilice operator.itemgetter() :

 from operator import itemgetter itemgetter(1, 5, 6, 8, 9, 12)(lst) 

Manifestación:

 >>> from operator import itemgetter >>> lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] >>> itemgetter(1, 5, 6, 8, 9, 12)(lst) (2, 6, 7, 9, 10, 13) 

Esto devuelve una tupla; convertir a una lista con list(itemgetter(...)(lst)) si es un requisito.

Tenga en cuenta que este es el equivalente de una expresión de sector ( lst[start:stop] ) con un conjunto de índices en lugar de un rango; no se puede utilizar como una asignación de lst[start:stop] = some_iterable del lado izquierdo ( lst[start:stop] = some_iterable ).

Las matrices numpy tienen este tipo de syntax de corte:

 In [45]: import numpy as np In [46]: lst = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]) In [47]: lst[[1, 5, 6, 8, 9, 12]] Out[47]: array([ 2, 6, 7, 9, 10, 13]) 

Es fácil y directo de usar una lista de comprensión.

 lst = range(1, 14) indices = [1, 5, 6, 8, 9, 12] filtered_lst = [lst[i] for i in indices] 

Iría con el método operator.itemgetter() que Martijn Pieters ha sugerido, pero aquí hay otra manera (para completar)

 In [23]: lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] In [24]: indices = set([1, 5, 6, 8, 9, 12]) In [25]: [n for i,n in enumerate(lst) if i in indices] Out[25]: [2, 6, 7, 9, 10, 13] 

Una porción de Python le permite convertir la división en el objective de una tarea. Y la syntax de corte de Python no permite cortes con patrones irregulares de índices. Por lo tanto, si desea que su división “personalizada” se convierta en el objective de una tarea, eso no es posible con la syntax de la porción Python.

Si se cumplen sus requisitos al tomar una copia de los elementos especificados, entonces operator.itemgetter() satisface sus necesidades. Si necesita una asignación de rebanadas, entonces las rebanadas de números son una buena opción.