J'ai besoin de choisir certains éléments de la liste donnée, en connaissant leur index. Disons que je voudrais créer une nouvelle liste, qui contient un élément d'index 1, 2, 5, à partir d'une liste donnée [-2, 1, 5, 3, 8, 5, 6]. Ce que j'ai fait c'est:
a = [-2,1,5,3,8,5,6]
b = [1,2,5]
c = [ a[i] for i in b]
Y a-t-il une meilleure façon de le faire? quelque chose comme c = a [b]?
lambda
fonction.Réponses:
Vous pouvez utiliser
operator.itemgetter
:Ou vous pouvez utiliser numpy :
Mais vraiment, votre solution actuelle est très bien. C'est probablement le plus net de tous.
la source
c = [a[i] for i in b]
c'est parfaitement bien. Notez que laitemgetter
solution ne fera pas la même chose si b a moins de 2 éléments.a[b]
fonctionne que lorsqu'ila
s'agit d'un tableau numpy , c'est-à-dire que vous le créez avec une fonction numpy.Alternatives:
la source
build-in
fonctions__getitem__
cela ne semble pas être comparable, par exemple, comment mapper le type de l'élément?map(type(a.__getitem__), b)
lambda x: type(a.__getitem__(x)), b
. Dans ce cas, l'utilisation[..]
est plus compacte:lambda x: type(a[x]), b
Une autre solution pourrait être via la série pandas:
Vous pouvez ensuite reconvertir c en liste si vous le souhaitez:
la source
Tests basiques et peu poussés comparant le temps d'exécution des cinq réponses fournies:
en utilisant l'entrée suivante:
la boucle python simple était la plus rapide avec l'opération lambda une seconde près, mapIndexValues et getIndexValues étaient constamment assez similaires avec la méthode numpy beaucoup plus lente après la conversion des listes en tableaux numpy.Si les données sont déjà dans les tableaux numpy, la méthode numpyIndexValues avec la conversion numpy.array supprimée est le plus rapide.
la source
numpyIndexValues
ne fonctionne pas depuisa
,b
sont de typerange
. Je suppose que vous avez l'intention de vous convertira
,b
d'numpy.ndarrays
abord?Je suis sûr que cela a déjà été pris en compte: si la quantité d'indices en b est petite et constante, on pourrait simplement écrire le résultat comme:
Ou encore plus simple si les indices eux-mêmes sont constants ...
Ou s'il y a une gamme consécutive d'indices ...
la source
[a] + [b] = [a, b]
Voici un moyen plus simple:
la source
Ma réponse n'utilise pas de collections numpy ou python.
Une façon triviale de trouver des éléments serait la suivante:
Inconvénient: cette méthode peut ne pas fonctionner pour les grandes listes. L'utilisation de numpy est recommandée pour les grandes listes.
la source
a
.[a[i] for i in b]
a
avait encore 5?[a[i] if i<len(a) else None for i in b]
Index statiques et petite liste?
N'oubliez pas que si la liste est petite et que les index ne changent pas, comme dans votre exemple, la meilleure chose à faire est parfois d'utiliser le décompression de séquence :
Les performances sont bien meilleures et vous pouvez également enregistrer une ligne de code:
la source
Type de manière pythonique:
la source
O(n)
solution en uneO(n^2)
solution tout en doublant presque la longueur du code. Vous voudrez également noter que l'approche échouera si la liste contient des objets sera floue ou égalité partielle, par exemple sia
contientfloat('nan')
, cela soulèvera toujours aValueError
.