0
votes

Obtenez seulement le dernier élément d'un itérateur de la manière la plus pythonique

Comment puis-je obtenir le dernier élément d'un itérateur? Je suis conscient que je dois épuiser l'itérateur et renvoyer la dernière valeur qu'elle produite, de sorte que l'approche ordinaire serait la suivante: xxx

(vous voudrez peut-être attraper le NameError et soulever quelque chose d'autre pour l'entrée vide, mais vous obtenez l'idée.)

Y a-t-il une solution plus simple que je ne pensais pas, e. g. en utilisant ithertools.lice () (il ne semble pas accepter des indices négatifs, cependant) ou quelque chose de similaire?


1 commentaires

Vous pouvez renvoyer ici


4 Réponses :


2
votes

Peut-être que vous pouvez utiliser xxx

il est l'itérateur.

Vous le convertissez dans une liste et obtenez le dernier élément.


1 commentaires

Cela stocke brièvement tous les éléments de la mémoire, juste pour obtenir la dernière fois.



5
votes

Une solution plus simple pourrait être d'utiliser Déballage intégré étendu : xxx pré>


Exemple: p>

it = range(10)
*_, last = it
print(last)
# 9


4 commentaires

Êtes-vous sûr que plage () renvoie un itérateur et non une liste?


@Gsk isinstance (plage (10), liste)


Malheureusement, il s'approche de la liste [- 1] qui maintient tous les éléments en mémoire à une fois également (votre solution les stocke brièvement dans _ ).


@yatu Désolé, mauvaise formulation de la question: Plage () retourne un itérateur, pas un itérateur . Je suis juste curieux, je trouve votre réponse intéressante



1
votes

Ce n'est pas une voie pythonique, mais juste une autre solution. Si vous êtes correct d'utiliser Toolz . Ensuite, vous pouvez faire ce qui suit.

from toolz import last

last(it)


0 commentaires

1
votes

Ce qui suit est d'environ 26% plus rapide que

import collections
def last(iterator):
    return collections.deque(iterator, maxlen=1).pop()


0 commentaires