2009-06-18 9 views
56

Je voudrais indexer une liste avec une autre liste comme celleEn Python, comment indexer une liste avec une autre liste?

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

et T devrait finir par être une liste contenant [ 'a', 'd', 'h'].

Y at-il une meilleure façon que

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

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

Répondre

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

Est-ce plus rapide qu'une boucle for ou seulement plus courte? –

+4

@daniel: les deux + recommandé – SilentGhost

+7

Un test de synchronisation rapide (pas de pysco ou quoi que ce soit, alors faites-en ce que vous voulez) a montré la compréhension de la liste 2,5 fois plus rapide que la boucle (1000 éléments, répétée 10000 fois). –

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

a dû être converti en liste dans py3k – SilentGhost

25

Si vous utilisez numpy, vous pouvez effectuer le découpage étendu comme ça:

>>> 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') 

... et est probablement beaucoup plus rapide (si la performance est assez préoccupante pour s'embêter avec l'importation numpy)

+1

Mon test de temps rapide a montré que l'utilisation de np.array est en réalité presque 3 fois plus lente (y compris la conversion en tableau). –

3

Je n'étais pas satisfait de l'une de ces approches, donc je suis venu avec une classe Flexlist qui permet l'indexation flexible, soit par nombre entier, tranche ou liste d'index:

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

qui, par votre exemple, vous utiliseriez comme:

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]) 

Je voudrais utiliser un Dict add désiré keys-index

5

Une approche fonctionnelle:

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

from operator import itemgetter 

print(list(itemgetter(*b)(a))) 
[1, 34, 12] 
Questions connexes