Je suis venu ici en espérant trouver quelqu'un qui avait déjà fait le travail d'écriture de la version la plus efficace de list.rindex
qui fournit l'interface complète de list.index
(y compris l'option start
y stop
paramètres). Je n'ai pas trouvé cela dans les réponses à cette question, ni dans les réponses à la question suivante. aquí ou aquí ou aquí . J'ai donc rassemblé tout cela moi-même... en utilisant les suggestions des autres réponses à cette question et aux autres questions.
def rindex(seq, value, start=None, stop=None):
"""L.rindex(value, [start, [stop]]) -> integer -- return last index of value.
Raises ValueError if the value is not present."""
start, stop, _ = slice(start, stop).indices(len(seq))
if stop == 0:
# start = 0
raise ValueError('{!r} is not in list'.format(value))
else:
stop -= 1
start = None if start == 0 else start - 1
return stop - seq[stop:start:-1].index(value)
La technique utilisant len(seq) - 1 - next(i for i,v in enumerate(reversed(seq)) if v == value)
suggéré dans plusieurs autres réponses, peut être plus efficace en termes d'espace : il n'est pas nécessaire de créer une copie inversée de la liste complète. Mais dans mes tests (occasionnels), elle est environ 50% plus lente.