Quelle est la meilleure façon d'obtenir le dernier élément d'un itérateur dans Python 2.6? Par exemple, dites
my_iter = iter(range(5))
Quel est le plus court / Code manière la plus propre d'obtenir à 4
partir my_iter
?
Je pourrais le faire, mais cela ne semble pas très efficace:
[x for x in my_iter][-1]
iter(range(5))
Réponses:
la source
None
? C'est précisément à cela queNone
sert. Êtes-vous en train de suggérer qu'une valeur par défaut spécifique à une fonction pourrait même être correcte? Si l'itérateur n'itère pas réellement, alors une valeur hors bande est plus significative qu'une valeur par défaut spécifique à une fonction trompeuse.None
comme valeur par défaut, c'est votre choix. Aucun n'est pas toujours la valeur par défaut la plus sensée, et peut même ne pas être hors bande. Personnellement, j'ai tendance à utiliser 'defaultvalue = object ()' pour m'assurer que c'est une valeur vraiment unique. J'indique simplement que le choix de la valeur par défaut est en dehors de la portée de cet exemple.None
pour valeur finaleUtilisez un
deque
de taille 1.la source
Si vous utilisez Python 3.x:
si vous utilisez python 2.7:
Note latérale:
Habituellement, la solution présentée ci-dessus est celle dont vous avez besoin pour les cas réguliers, mais si vous avez affaire à une grande quantité de données, il est plus efficace d'utiliser un
deque
de taille 1. ( source )la source
*lst, last = some_iterable
._
est une variable spéciale en python et utilisée soit pour stocker la dernière valeur, soit pour dire que je ne me soucie pas de la valeur et qu'elle peut donc être nettoyée.__reversed__
Cela vaut probablement la peine d'être utilisé s'il est disponiblela source
Aussi simple que:
la source
enumerate
retourne(index, value)
comme:(0, val0), (1, val1), (2, val2)
... et ensuite, par défaut,max
lorsqu'on lui donne une liste de tuples, se compare uniquement à la première valeur du tuple, à moins que deux premières valeurs ne soient égales, ce qu'elles ne sont jamais ici car ils représentent des indices. Ensuite, l'indice de fin est que max renvoie le tuple entier (idx, valeur) alors que nous ne sommes intéressés que parvalue
. Idée intéressante.Il est peu probable que ce soit plus rapide que la boucle for vide à cause du lambda, mais cela donnera peut-être une idée à quelqu'un d'autre
Si l'iter est vide, une TypeError est levée
la source
TypeError
pour un itérables vide, vous pouvez également fournir une valeur par défaut par la valeur initialereduce()
, par exemplelast = lambda iterable, default=None: reduce(lambda _, x: x, iterable, default)
.Il y a ça
Si la durée de l'itération est vraiment épique - si longue que la matérialisation de la liste épuisera la mémoire - alors vous devez vraiment repenser la conception.
la source
J'utiliserais
reversed
, sauf qu'il ne prend que des séquences au lieu d'itérateurs, ce qui semble plutôt arbitraire.Quoi qu'il en soit, vous devrez parcourir tout l'itérateur. Avec une efficacité maximale, si vous n'avez plus jamais besoin de l'itérateur, vous pouvez simplement supprimer toutes les valeurs:
Je pense cependant que c'est une solution sous-optimale.
la source
La bibliothèque toolz fournit une solution intéressante:
Mais l'ajout d'une dépendance non essentielle peut ne pas valoir la peine de l'utiliser uniquement dans ce cas.
la source
Voir ce code pour quelque chose de similaire:
http://excamera.com/sphinx/article-islast.html
vous pouvez l'utiliser pour récupérer le dernier article avec:
la source
islast
dans votre réponse (voir meta.stackexchange.com/questions/8231/… ).Je voudrais juste utiliser
next(reversed(myiter))
la source
La question est d'obtenir le dernier élément d'un itérateur, mais si votre itérateur est créé en appliquant des conditions à une séquence, alors inversé peut être utilisé pour trouver le "premier" d'une séquence inversée, en regardant uniquement les éléments nécessaires, en appliquant inverser la séquence elle-même.
Un exemple artificiel,
la source
Alternativement, pour les itérateurs infinis, vous pouvez utiliser:
Je pensais que ce serait plus lent alors
deque
mais c'est aussi rapide et c'est en fait plus rapide que pour la méthode en boucle (en quelque sorte)la source
La question est fausse et ne peut conduire qu'à une réponse compliquée et inefficace. Pour obtenir un itérateur, vous partez bien sûr de quelque chose qui est itérable, qui dans la plupart des cas offrira un moyen plus direct d'accéder au dernier élément.
Une fois que vous avez créé un itérateur à partir d'un itérable, vous êtes obligé de parcourir les éléments, car c'est la seule chose qu'un itérable fournit.
Ainsi, le moyen le plus efficace et le plus clair n'est pas de créer l'itérateur en premier lieu mais d'utiliser les méthodes d'accès natives de l'itérable.
la source