88 votes

Comment trouver la dernière occurrence d'un élément dans une liste Python ?

Disons que j'ai cette liste :

li = ["a", "b", "a", "c", "x", "d", "a", "6"]

D'après ce que l'aide m'a montré, il n'y a pas de fonction intégrée qui renvoie la dernière occurrence d'une chaîne de caractères (comme l'inverse de index ). Donc, en gros, comment puis-je trouver la dernière occurrence de "a" dans la liste donnée ?

5voto

piRSquared Points 159

Avec dict

Vous pouvez utiliser le fait que les clés des dictionnaires sont uniques et que, lorsque vous en construisez un avec des tuples, seule la dernière affectation d'une valeur pour une clé particulière sera utilisée. Comme indiqué dans d'autres réponses, cela convient pour les petites listes mais crée un dictionnaire pour toutes les valeurs uniques et peut ne pas être efficace pour les grandes listes.

dict(map(reversed, enumerate(li)))["a"]

6

2voto

dubiousjim Points 2259

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.

1voto

Prabu M Points 59
last_occurence=len(yourlist)-yourlist[::-1].index(element)-1

C'est aussi simple que cela. Pas besoin d'importer ou de créer une fonction.

1voto

Hilarion Galushka Points 515

J'adore la solution de @alcalde, mais j'ai dû faire face à ValueError : max() arg est une séquence vide si aucun des éléments ne correspond à la condition.

Pour éviter l'erreur, définissez default=None :

max((loc for loc, val in enumerate(li) if val == 'a'), default=None)

0voto

Laurent LAPORTE Points 10193

Utilisez une simple boucle :

def reversed_index(items, value):
    for pos, curr in enumerate(reversed(items)):
        if curr == value:
            return len(items) - pos - 1
    raise ValueError("{0!r} is not in list".format(value))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X