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 :

[Problème] Algorithme inversion de listes.


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut [Problème] Algorithme inversion de listes.
    Bonjour,

    Je me permets de poster ici, en tant que débutant, pour vous exposer mon problème.

    Je dois écrire une fonction miroir telle que, si t est une liste, miroir(t) renvoie une liste qui contient les même valeurs que t mais rangées dans l'autre sens.

    Voici mon algorithme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def miroir(t) :
        if type(t)==list :
            r=t
            for i in range(len(t)-1) :
                r[i]=t[len(r)-1-i]
            return(r)
        else :
            print("ceci n'est pas une liste !")
    Problème, l'algorithme n'inverse que la première moitié de ma liste : si je demande miroir([1,2,3,4,5]), il m'affiche [5,4,3,4,5]. J'ai beau essayer...

    Merci d'avance pour vos réponses.

  2. #2
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> def miroir(t):
    ...     m = []
    ...     for i in range(len(t)-1, -1, -1):
    ...         m.append(t[i])
    ...     return m
    ... 
    >>> miroir([1, 2, 3])
    [3, 2, 1]
    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)

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup !

  4. #4
    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
    Plusieurs erreurs, pour combler cela voir la documentation de range.

    Éviter les print dans des fonctions, utilise le mot clé raise, pour sortir une erreur.

    Bonne continuation...
    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)

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur calcul et simulation
    Inscrit en
    Juin 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Ingénieur calcul et simulation
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 41
    Points : 60
    Points
    60
    Par défaut
    En fait, ton problème vient du que dans ta version initiale, r et t ne sont pas des listes indépendantes. Ce sont juste 2 noms qui indiquent la même liste.
    Pour mieux comprendre, tu peux le visualiser en faisant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def miroir(t) :
        if type(t)==list :
            r=t
            for i in range(len(t)-1) :
                r[i]=t[len(r)-1-i]
                print(r, t)
            return(r)
        else :
            print("ceci n'est pas une liste !")
    en remplaçant la ligne :
    par :
    Tu aurai créé une liste r copie de t, mais indépendante. Et ton algo aurait marché (au détail près qu'il manque un incrément dans les tests que j'en ai fait, donc il "oublie" le dernier élément de la liste)

  6. #6
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Bonjour,
    Le problème fondamental dans l'algorithme est:

    Les identifiants r et t renvoient alors sur le même objet, ici la liste proprement dite.
    En conséquence, lorsque r est modifié par assignation directe, t l'est aussi.
    Et donc, l'inversion est réalisée tout en modifiant la liste elle-même.
    Pour s'en convaincre (votre code plus quelques fonctions "print":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    def miroir(t) :
        if type(t)==list :
            r=t
            for i in range(len(t)-1) :
                r[i]=t[len(r)-1-i]
                print("r: ", r)
                print("t: ", t)
                print()
            return(r)
        else :
            print("ceci n'est pas une liste !")
     
     
    lst = [1, 2, 3, 4, 5, 6]
    print(miroir(lst))
    Renvoie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    >>> 
    r:  [6, 2, 3, 4, 5, 6]
    t:  [6, 2, 3, 4, 5, 6]
     
    r:  [6, 5, 3, 4, 5, 6]
    t:  [6, 5, 3, 4, 5, 6]
     
    r:  [6, 5, 4, 4, 5, 6]
    t:  [6, 5, 4, 4, 5, 6]
     
    r:  [6, 5, 4, 4, 5, 6]
    t:  [6, 5, 4, 4, 5, 6]
     
    r:  [6, 5, 4, 4, 5, 6]
    t:  [6, 5, 4, 4, 5, 6]
     
    [6, 5, 4, 4, 5, 6]
    Clodion

  7. #7
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Bonjour,
    Autre petite erreur:
    "for i in range(len(t) - 1 ):"

    Ceci ne parcours pas la liste dans son intégralité. Il manque le dernier indice de la liste.
    Pour parcourir complètement les indices d'une liste il faut simplement faire:
    "for i in range(len(t)):"

    Clodion

  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
    Algorithmiquement, il n'y a absolument aucune logique à dire même r=t, c'est tout à fait une très mauvaise idée conceptuelle, même si la syntaxe aurait été correcte.

    On demande une nouvelle liste et non une liste modifiée, représentant son mirroir.

    Conception parlée, créer une nouvelle liste est la seule logique correcte... pourquoi lui parler d'une copie indépendante de sa liste t pour la modifier ensuite, alors que c'est faux?
    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
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    En Python, ça s’écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> mirroir = lambda L: L[::-1]
    >>> l = [1, 2, 3]
    >>> mirroir(l)
    [3, 2, 1]
    Maintenant, si le but est d'apprendre a utiliser range dans les boucles for...
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Bonjour,
    @wiztricks: tout à fait d'accord!
    @fred1599: idem, tout à fait d'accord!

    J'ai plus pris la question pour une demande de correction des erreurs du code.

    Clodion

Discussions similaires

  1. Probléme avec zone de liste dépendante!
    Par sunflower dans le forum IHM
    Réponses: 5
    Dernier message: 26/12/2005, 17h34
  2. algorithme inversement de bits
    Par miminou dans le forum C
    Réponses: 8
    Dernier message: 18/11/2005, 19h50
  3. Problème de raffraichissement de listes
    Par blondin01 dans le forum Access
    Réponses: 7
    Dernier message: 13/10/2005, 12h31
  4. problème algorithme récursif
    Par seb888 dans le forum Général Java
    Réponses: 11
    Dernier message: 04/06/2005, 21h35
  5. Problème pour positionner une liste déroulante
    Par ouckileou dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 30/09/2004, 01h05

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