IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

parcourir liste avec 2 indices


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut parcourir liste avec 2 indices
    Bonjour, je souhaite écrire un programme qui enlève les doublons sur une chaîne de caractère. Je suis débutant et j'ai un message d'erreur index out of range en utilisant ce programme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    m=str(input("entrer votre mélodie"))
    liste=list(m)
    for i in range(len(liste)-1):
        if liste[i]==liste[i+1]:
            liste.remove(liste[i])
            liste.remove(liste[i+1])
    print(liste)
    ce qui cloche c'est à la ligne du if mais je ne comprends pas pourquoi
    je vous remercie.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 048
    Points : 1 378
    Points
    1 378
    Par défaut
    Parcours la liste à l'envers.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    merci pour ta réponse, j'ai essayé ce code mais il y a le même message d'erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    m=str(input("entrer votre mélodie"))
    liste=list(m)
    for i in range(len(liste)-1,0,-1):
        if liste[i]==liste[i+1]:
            liste.remove(liste[i])
            liste.remove(liste[i+1])
    print(liste)

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 35
    Points : 99
    Points
    99
    Par défaut
    Bonjour,

    Citation Envoyé par sparrow88 Voir le message
    Bonjour, je souhaite écrire un programme qui enlève les doublons sur une chaîne de caractère. Je suis débutant et j'ai un message d'erreur index out of range en utilisant ce programme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    m=str(input("entrer votre mélodie"))
    liste=list(m)
    liste=set(liste)
    ?


    Je ne sais pas s'il s'agit d'une formulation ou pas mais ta phrase indique que tu cherches à supprimer les doublons d'une chaîne de caractères tandis que ton code indique que tu veux supprimer les lettres identiques mises côte à côte.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    merci, mais je voudrais comprendre pourquoi il y a un message d'erreur lorsque je parcours la liste

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 35
    Points : 99
    Points
    99
    Par défaut
    Citation Envoyé par sparrow88 Voir le message
    merci, mais je voudrais comprendre pourquoi il y a un message d'erreur lorsque je parcours la liste
    Admettons que ta chaine soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    m = 'aabbccdd'
    liste = list(m)
    Donc len(liste) = 8

    Du coup ton For cherches à boucler 8-1 fois.
    Or tu vas supprimer 4 occurrences.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    liste = ['a','b','c','d']
    Mais ta boucle For voudra poursuivre la lecture jusqu'à la 8ème valeur de la liste (pour liste.remove(liste[i+]) qui n'en contient désormais que 4.
    --> Index out of range

  7. #7
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Ce n'est pourtant pas compliqué.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    liste = ['a', 'b', 'd', 'e']            # len(liste) = 4
    for i in range(len(liste)-1, 0, -1):    # équivalent à for i in [3, 2, 1]
        if liste[i] == liste[i+1]:          # équivalent à if liste[3] == liste[4] ou encore if 'e' == out of range
    CQFD

    il faut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in range(len(liste)-2, -1, -1):

  8. #8
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    À part set qui est la solution la plus simple, celle qui suit serait de créer une mémoire est de vérifier si la lettre n'a pas déjà été enregistrée dans cette mémoire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> m = 'aabbccdd'
    >>> memory = []
    >>> for letter in m:
    ...     if letter not in memory:
    ...         memory.append(letter)
    ... 
    >>> ''.join(memory)
    'abcd'
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  9. #9
    Membre actif Avatar de Kurodiam
    Inscrit en
    Décembre 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 208
    Points : 215
    Points
    215
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    À part set qui est la solution la plus simple, celle qui suit serait de créer une mémoire est de vérifier si la lettre n'a pas déjà été enregistrée dans cette mémoire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> m = 'aabbccdd'
    >>> memory = []
    >>> for letter in m:
    ...     if letter not in memory:
    ...         memory.append(letter)
    ... 
    >>> ''.join(memory)
    'abcd'
    Donc l'enregistrement des lettres dans cette mémoire se fait une seule fois : l'expression booléenne "not in" voit si la lettre est présente dans la liste memory , et ensuite la méthode append remplit au fur et à mesure la liste memory grâce à la boucle for (qui permet d'itérer sur une liste là ) .
    _""""Cats have a big heart ^^ unlike some bad people (whose will never change in their brain) """

  10. #10
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Oui c'est ça, si on veut en rester au set mais ordonné dans ce cas, on peut utiliser l'implémentation de Hettinger
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Il faut préciser "enlever les doublons".
    Le code proposé par Fred fabrique "abcd" à partir de "aabbccddaaabbcccddddd".
    Mais enlever les doublons peut être pris au sens "répétitions".
    Dans ce cas, le résultat attendu serait plutôt "abcdabcd".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2012
    Messages : 3
    Points : 4
    Points
    4
    Par défaut je propose ceci
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Il faut préciser "enlever les doublons".
    Le code proposé par Fred fabrique "abcd" à partir de "aabbccddaaabbcccddddd".
    Mais enlever les doublons peut être pris au sens "répétitions".
    Dans ce cas, le résultat attendu serait plutôt "abcdabcd".

    - W
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    mot = "aabbccddaaabbcccddddd"
    mem = res = ""
    for c in mot:
        if c not in mem:
           res +=c
           mem = c
    print(res)

  13. #13
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2012
    Messages : 3
    Points : 4
    Points
    4
    Par défaut avec groupby de itertools
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Il faut préciser "enlever les doublons".
    Le code proposé par Fred fabrique "abcd" à partir de "aabbccddaaabbcccddddd".
    Mais enlever les doublons peut être pris au sens "répétitions".
    Dans ce cas, le résultat attendu serait plutôt "abcdabcd".

    - W
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    from itertools import *
    mot = "aabbccddaaabbcccddddd"
    res = "".join([c for (c,g) in groupby(mot)])
    print(res)

  14. #14
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Sinon il est possible de faire ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import re
     
    m = 'aaabbbbcccdddeefffaaabbbcccdd'
     
    result = re.sub(r'(.)\1+', r'\1', m)
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. [Python 3.X] Déplacement de terme d'une liste vers une autre liste avec un indice différent
    Par PoelQ dans le forum Général Python
    Réponses: 5
    Dernier message: 09/01/2015, 22h06
  2. Parcourir liste quelque soit l'indice
    Par Paulo62 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 31/07/2011, 15h52
  3. Réponses: 2
    Dernier message: 18/06/2010, 15h39
  4. Liste chainee avec index/indices
    Par eagl1 dans le forum C++
    Réponses: 19
    Dernier message: 20/10/2009, 21h12
  5. parcourir une List avec différents objets
    Par laurentlorient dans le forum Débuter avec Java
    Réponses: 10
    Dernier message: 03/08/2009, 09h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo