J'essaie donc de créer un programme pour supprimer toutes les lettres en double d'une chaîne donnée. Le code est essentiellement un itérateur fait maison, que j'ai obtenu d'un autre post ici : Comment réinitialiser un itérateur de liste en Python ?

string = "NNEEXXxxTTGGEENNCCOODDEERR"

class rmvDuplicates:

def __init__(self, list, newString):
    self.newString = newString
    self.list = list
    self.idx = 0
    self.content = list[self.idx]

def __iter__(self):
    return self

def get_content(self, content):
    return content

def get_index(self):
    return self.idx

def get_content_next(self, content):
    try:
        self.idx += 1
        return self.content
    finally:
        self.idx -= 1

def remove(self, elem):
    del self.list[self.idx]
    return

def rewind(self):
    self.idx = 0

def __next__(self):
    try:
        return self.list[self.idx]
    except IndexError:
        pass
    finally:
        self.idx += 1
        self.content = self.list[self.idx]  

new_String = []

li = rmvDuplicates(list(string), new_String)

for elem in li:
    if li.get_content(elem) == li.get_content_next(elem):
        print(li.get_content(elem))
        li.remove(elem)
        print(li.list)

print("Hello")

Remarque: le print("Hello") est juste à des fins de test

Je l'ai modifié un peu pour répondre à mes besoins et cela fonctionne très bien, jusqu'à ce qu'il atteigne le point de IndexError.

def __next__(self):
    try:
        return self.list[self.idx]
    except IndexError:
        pass
    finally:
        self.idx += 1
        self.content = self.list[self.idx]

J'ai déjà essayé de comprendre cela moi-même, en utilisant Except-Block avec la méthode pass.

Mais encore, le programme affiche ce message:

Traceback (most recent call last):
  File "rmv_dplc_cls.py", line 49, in <module>
    for elem in li:
  File "rmv_dplc_cls.py", line 42, in __next__
    self.content = self.list[self.idx]
IndexError: list index out of range

Est-ce que quelqu'un ici sait comment résoudre ce problème, afin que le programme continue de fonctionner et n'interrompe pas.

Merci

-2
BlueUnicorn 17 mars 2019 à 01:02

2 réponses

Meilleure réponse

Essayez de changer votre méthode __next__ en:

def __next__(self): 
    try: 
        value = self.list[self.idx]
        self.idx += 1
    except IndexError:
        self.idx = 0
        value = self.list[self.idx]
    finally:
        return value

Explication:

Si votre clause try échoue, cela signifie que self.list[self.idx] accède à un élément qui est en dehors de votre plage de liste, rhus augmentant le IndexError. Cela étant, essayer d'accéder au même self.list[self.idx] entraînera une autre IndexError cette fois en dehors de la clause try.

0
jfaccioni 16 mars 2019 à 22:11

Merci @jfaccioni. Votre suggestion a été très utile. Cela ne fonctionnait pas vraiment pour moi, alors je l'ai un peu modifié, comme ceci:

def __next__(self):
    try:
        value = self.list[self.idx]
        self.idx += 1
        self.content = self.list[self.idx]
    except IndexError:
        value = self.list[self.idx]
    finally:
        if self.idx == len(self.list):
            raise StopIteration
        return value

J'avais besoin de self.content pour que ma fonction fonctionne.

Merci de votre aide.

1
BlueUnicorn 17 mars 2019 à 14:05