2009-06-18 26 views
56

me gustaría índice una lista con otra lista como estaEn Python, ¿cómo indexo una lista con otra lista?

L = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] 
Idx = [0, 3, 7] 
T = L[ Idx ] 

y T debe llegar a ser una lista que contiene [ 'a', 'd', 'h'].

¿Existe una manera mejor que

T = [] 
for i in Idx: 
    T.append(L[i]) 

print T 
# Gives result ['a', 'd', 'h'] 

Respuesta

135
T = [L[i] for i in Idx] 
+1

¿Es esto más rápido que un bucle for o solo más corto? –

+4

@daniel: both + recommended – SilentGhost

+7

Una prueba de tiempo rápida (sin pysco ni nada, así que hazlo como quieras) mostró la comprensión de la lista 2,5 veces más rápido que el bucle (1000 elementos, repetidos 10000 veces). –

6
T = map(lambda i: L[i], Idx) 
+5

necesitaba ser convertido a la lista en py3k – SilentGhost

25

Si está utilizando numpy, puede realizar el corte en lonchas extendida así:

>>> import numpy 
>>> a=numpy.array(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']) 
>>> Idx = [0, 3, 7] 
>>> a[Idx] 
array(['a', 'd', 'h'], 
     dtype='|S1') 

... y es probablemente mucho más rápido (si el rendimiento es suficiente como para preocuparse por la importación numpy)

+1

Mi prueba rápida de tiempo demostró que el uso de np.array es en realidad casi 3 veces más lento (incluida la conversión a una matriz). –

3

que no estaba contento con cualquiera de estos enfoques, por lo que se le ocurrió una clase Flexlist que permite el ajuste flexible, ya sea por entero, rebanada o el índice de lista:

class Flexlist(list): 
    def __getitem__(self, keys): 
     if isinstance(keys, (int, slice)): return list.__getitem__(self, keys) 
     return [self[k] for k in keys] 

Lo cual, por su ejemplo, se usaría como:

L = Flexlist(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']) 
Idx = [0, 3, 7] 
T = L[ Idx ] 

print(T) # ['a', 'd', 'h'] 
1
L= {'a':'a','d':'d', 'h':'h'} 
index= ['a','d','h'] 
for keys in index: 
    print(L[keys]) 

me gustaría utilizar un Dict add desear keys-index

5

Un enfoque funcional:

a = [1,"A", 34, -123, "Hello", 12] 
b = [0, 2, 5] 

from operator import itemgetter 

print(list(itemgetter(*b)(a))) 
[1, 34, 12] 
Cuestiones relacionadas