web-dev-qa-db-fra.com

Choisir des éléments d'une liste python qui ont des index spécifiques

Je suis sûr qu'il y a une bonne façon de faire cela en Python, mais je suis plutôt nouveau dans le langage, alors pardonnez-moi s'il s'agit d'un langage facile!

J'ai une liste et j'aimerais choisir certaines valeurs de cette liste. Les valeurs que je veux choisir sont celles dont les index dans la liste sont spécifiés dans une autre liste.

Par exemple:

indexes = [2, 4, 5]
main_list = [0, 1, 9, 3, 2, 6, 1, 9, 8]

la sortie serait:

[9, 2, 6]

(c'est-à-dire, les éléments avec les index 2, 4 et 5 de main_list).

J'ai le sentiment que cela devrait être faisable en utilisant quelque chose comme la compréhension de liste, mais je ne peux pas le comprendre (en particulier, je ne peux pas comprendre comment accéder à l'index d'un élément en utilisant une compréhension de liste).

26
Ben
[main_list[x] for x in indexes]

Cela retournera une liste des objets, en utilisant une compréhension de liste.

82
t = []
for i in indexes:
    t.append(main_list[i])
return t
4
Yuval Adam
map(lambda x:main_list[x],indexes)
1
Rubén Morales

Je pense que la solution de Yuval A est assez simple et claire. Mais si vous voulez réellement une compréhension en une ligne:

[e for i, e in enumerate(main_list) if i in indexes]
1
unbeknown

Au lieu d’une compréhension de liste, vous pouvez utiliser map avec list.__getitem__. Pour les grandes listes, vous devriez voir de meilleures performances:

import random

n = 10**7
L = list(range(n))
idx = random.sample(range(n), int(n/10))

x = [L[x] for x in idx]
y = list(map(L.__getitem__, idx))

assert all(i==j for i, j in Zip(x, y))

%timeit [L[x] for x in idx]            # 474 ms per loop
%timeit list(map(L.__getitem__, idx))  # 417 ms per loop

Pour un itérateur paresseux, vous pouvez simplement utiliser map(L.__getitem__, idx). Note dans Python 2.7, map renvoie une liste, il n'est donc pas nécessaire de passer à list.

0
jpp