En Python, quel est le meilleur moyen de créer une nouvelle liste dont les éléments sont les mêmes que ceux d'une autre liste, mais dans l'ordre inverse? (Je ne veux pas modifier la liste existante en place.)
Voici une solution qui m'est venue à l'esprit:
new_list = list(reversed(old_list))
Il est également possible de dupliquer old_list
puis d'inverser le duplicata en place:
new_list = list(old_list) # or `new_list = old_list[:]`
new_list.reverse()
Y a-t-il une meilleure option que j'ai négligée? Sinon, y a-t-il une raison impérieuse (comme l'efficacité) d'utiliser l'une des approches ci-dessus plutôt que l'autre?
la source
list(reversed(oldlist))
. Autre qu'un micro-optimisation mineurs, est - il une raison de préférer[::-1]
àreversed()
?reversed
présente un énorme avantage lorsque vous n'avez pas besoin de la liste, car elle ne gaspille pas de mémoire ni de temps à construire. Mais quand vous avez besoin de la liste, en utilisant au[::-1]
lieu delist(reversed())
est analogue à l' aide d' un[listcomp]
lieu delist(genexpr)
.[::-1]
signifie supprimer le dernier élément d'une liste, plutôt que de l'inverser.reversed(list)
indique exactement ce qu'il fait; il énonce son intention, au sens «Explicite vaut mieux qu'implicite», «La lisibilité compte» et «Sparse vaut mieux que dense».Maintenant allons
timeit
. Indice: celui d' Alex[::-1]
est le plus rapide :)Mise à jour: Ajout de la méthode de compilation de liste suggérée par inspectorG4dget. Je vais laisser les résultats parler d'eux-mêmes.
la source
[::-1]
Ajustements
Cela vaut la peine de fournir une référence / un ajustement de base pour les calculs de timeit par sdolan qui montrent les performances de `` inversé '' sans la
list()
conversion souvent inutile . Cettelist()
opération ajoute 26 usecs supplémentaires au runtime et n'est nécessaire que dans le cas où un itérateur est inacceptable.Résultats:
Calculs:
Conclusions:
La conclusion de ces tests est
reversed()
plus rapide que la tranche[::-1]
de 12,4 usecsla source
''.join(reversed(['1','2','3']))
, la méthode de tranche est encore> 30% plus rapide.