J'ai une liste avec des valeurs qui se produisent plusieurs fois. Je veux faire une boucle sur la liste et vérifier si la valeur se produit la première fois.
Par exemple: disons que j'ai une seule liste comme,
L = ['a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'e', 'e', 'e' .... ...]
Maintenant, à chaque première occurrence d'élément, je veux effectuer un ensemble de tâches.
Comment obtenir la première occurrence d'élément?
Merci d'avance!!
3 Réponses :
Utilisez un set
pour vérifier si vous avez déjà traité cet élément:
visited = set() L = ['a','a','a','b','b','b','b','b','e','e','e'.......] for e in L: if e not in visited: visited.add(e) # process first time tasks else: # process not first time tasks
Vous pouvez utiliser unique_everseen
des recettes itertools .
Cette fonction renvoie un générateur qui ne produit que la première occurrence d'un élément.
0 a 2 b 3 c
lst = ['a', 'a', 'b', 'c', 'b'] for i, x in unique_everseen(enumerate(lst), key=lambda x: x[1]): print(i, x)
a b c
La fonction unique_everseen
permet également de passer une key
de comparaison d'éléments. Ceci est utile dans de nombreux cas, par exemple si vous avez également besoin de connaître la position de chaque première occurrence.
lst = ['a', 'a', 'b', 'c', 'b'] for x in unique_everseen(lst): print(x) # Do something with the element
from itertools import filterfalse def unique_everseen(iterable, key=None): "List unique elements, preserving order. Remember all elements ever seen." # unique_everseen('AAAABBBCCDAABBB') --> A B C D # unique_everseen('ABBCcAD', str.lower) --> A B C D seen = set() seen_add = seen.add if key is None: for element in filterfalse(seen.__contains__, iterable): seen_add(element) yield element else: for element in iterable: k = key(element) if k not in seen: seen_add(k) yield element
Pourquoi ne pas l'utiliser?
L = ['a','a','a','b','b','b','b','b','e','e','e'.......] for idxL, L_idx in enumerate(L): if (L.index(L_idx) == idxL): print("This is first occurence")
Pour les listes très longues, c'est moins efficace que de construire un ensemble avant la boucle, mais semble plus direct à écrire.
Vous voulez dire que vous voulez l' index de la première occurrence?
Si je peux obtenir un index, alors c'est bien, l'objectif principal est de vérifier quand l'élément se produit pour la première fois.