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).
[main_list[x] for x in indexes]
Cela retournera une liste des objets, en utilisant une compréhension de liste.
t = []
for i in indexes:
t.append(main_list[i])
return t
map(lambda x:main_list[x],indexes)
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]
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
.