2
votes

Vérifiez si l'élément se produit pour la première fois dans la liste python

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!!


2 commentaires

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.


3 Réponses :


3
votes

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


0 commentaires

0
votes

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.

Code

0 a
2 b
3 c

Exemple

lst = ['a', 'a', 'b', 'c', 'b']

for i, x in unique_everseen(enumerate(lst), key=lambda x: x[1]):
    print(i, x)

Production

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.

Exemple

lst = ['a', 'a', 'b', 'c', 'b']

for x in unique_everseen(lst):
    print(x) # Do something with the element

Production

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


0 commentaires

0
votes

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.


0 commentaires