web-dev-qa-db-fra.com

En Python, comment puis-je indexer une liste avec une autre liste?

Je voudrais indexer une liste avec une autre liste comme celle-ci

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 a-t-il un meilleur moyen que

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

print T
# Gives result ['a', 'd', 'h']
100
Daniel Andrén
T = [L[i] for i in Idx]
198
van

Si vous utilisez numpy, vous pouvez effectuer un découpage étendu de la manière suivante:

>>> 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 les performances suffisent à gêner l'importation importée numpy)

34
Paul

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]
8
Padraic Cunningham
T = map(lambda i: L[i], Idx)
7
Mehrdad Afshari

Aucune de ces approches ne me convenait, alors j'ai créé une classe Flexlist qui permet une indexation flexible, que ce soit par un entier, une tranche ou une 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, pour 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']
3
jedwards
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

1
user4749532