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 :

Petit problème d'algorithme


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 31
    Points : 13
    Points
    13
    Par défaut Petit problème d'algorithme
    Bonjour, je suis débutant en langage python et je viens d'écrire ce petit code :

    01 x = ["a", "b", "c", "d", "e"]
    02 y = [ [ ] ]
    03 i = 0
    04 While i < len(x) - 1 :
    05 if x[i] != y[i] :
    06 y = y.append([])
    07 i = i + 1
    08 print(x)
    09 print(y)


    Vous l'aurez peut être compris, je veux que chaque fois que l'interpréteur trouve un élément dans la liste x, il ajoute une liste vide à la liste y. La ligne 5 pose problème - je n'arrive pas à trouver la bonne comparaison. Pouvez-vous m'aider s'il vous plaît? Merci d'avance pour votre réponse.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Bonsoir,

    Utilise la balise [code] (symbole # dans la barre d'outils de l'éditeur), s'il te plaît. Sans cela le code est presque incompréhensible, vu que l'indentation est syntaxiquement importante en Python.

    Cela dit, ta description de l'algorithme n'est pas claire. Que cherches-tu à faire exactement ? Avoir une liste y qui contient autant de listes vides qu'il y a d'éléments dans x ? Ou d'éléments uniques dans x ? Donne quelques exemples d'entrées (x) et de sorties (y) souhaitées si tu as du mal à le décrire.

  3. #3
    Membre averti Avatar de alexdevl
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 265
    Points : 344
    Points
    344
    Par défaut
    Bonjour,

    Outre l'algorithme, j’attire ton attention sur un point :
    y est une liste, une liste est un objet sur lequel on applique la méthode .append()
    Cela s'écrit :
    http://docs.python.org/tutorial/datastructures.html

    Sinon voici des pistes pour compléter ton algorithme (il y a beaucoup de solutions mais en restant dans ton idée)
    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
    18
    19
    20
    x = ["a", "b", "c", "d", "e"]
    y = [ [ ] ]
    i = 0
    while i < len(x) - 1 :
        if x[i] != y[i] :
            y.append([]) #Pas y=y.append([])
            i = i + 1
    print (x)
    print (y)
     
    # Avec un dictionnaire
    x2 = ["a", "b", "c", "d", "e","a"]
    y2={}
    for c in x2:
        if c not in y2 :
            y2[c]=1
        else :
            y2[c]+=1
    print (x2)
    print (y2)

  4. #4
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    Je suis sous Python 2.6.5 et je ne comprend pas qu'il ya des chiffres séparer par des espaces dans les noms des variables ???
    Normalement un nom de variable commence par une lettre et peut en contenir tout comme des chiffres et le symbole de soulignment ('_') en python 2.6.5 mais j'ai entendu dire que les chiffres était autoriser comme premier charactère de nom de variable en Python 3.

    Bon après nos bon conseils afin de te guider dans ta quète de python et si tu souhaite continuer voici les liens pour télécharger la doc officielle de python (en anglais):
    Pour python 2.6.7: http://docs.python.org/release/2.6.7/download.html
    Pour python 2.7.2: http://docs.python.org/download.html
    Pour python 3.1.3: http://docs.python.org/release/3.1.3/download.html
    Pour python 3.3a: http://docs.python.org/dev/py3k/download.html
    Ces document te seront très utile dans ta quète de python.
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  5. #5
    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
    Citation Envoyé par Luke spywoker Voir le message
    Je suis sous Python 2.6.5 et je ne comprend pas qu'il ya des chiffres séparer par des espaces dans les noms des variables ???
    J'ai eu la même réaction.



    Ce ne sont pas des noms de variables mais des numéros de lignes suivis de noms de variables.

    Citation Envoyé par selver057 Voir le message
    ... je veux que chaque fois que l'interpréteur trouve un élément dans la liste x, il ajoute une liste vide à la liste y.
    Quelque chose comme ça quoi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    >>> x = ["a", "b", "c", "d", "e"]
    >>> y = [[]] * len(x)
    >>> y
    [[], [], [], [], []]

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 31
    Points : 13
    Points
    13
    Par défaut Petit problème de programmation
    Merci à tous pour vos conseils

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 31
    Points : 13
    Points
    13
    Par défaut Petit problème de programmation
    Je corse un peu l'affaire :

    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
    18
    19
    20
    21
    22
    class Nom_Prenom(object):
    ...      def __init__(self):
                  x = [ ]
                  y = [ ]
                  i  = 0
                  while i < len(x) - 1 :
                          if x[i] != y[i]:
                               y.append([ ])
                                i = i + 1
    ...      def ajouterNom(self):
                  n = input("Entrez un nom : ")
                  if n in x:
                          print ("Attention! Ce nom existe deja.")
                          n = input("Entrez un nouveau nom : ")
                          x.append(n)
                          y.append([ ])
    ...      def afficher(self):
                  print (x)
                  print (y)
    >>>
    >>>
    >>> G = Nom_Prenom()
    Quelle doit être la suite des appels pour pouvoir tester l'algorithme?

  8. #8
    Membre averti Avatar de alexdevl
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 265
    Points : 344
    Points
    344
    Par défaut
    Bonjour,
    J'ai l'impression que tu pars un peu dans tout les sens .
    par exemple comme cité plus haut par vinsS (c)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                  while i < len(x) - 1 :
                          if x[i] != y[i]:
                               y.append([ ])
                                i = i + 1
    peux être remplacé par
    Il te manque des bases il me semble

    Essaie de suivre un tutoriel pour être graduel dans l’apprentissage :
    Exemple :
    http://python.developpez.com/cours/TutoSwinnen/

    Amicalement

    Alex

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 31
    Points : 13
    Points
    13
    Par défaut Petit problème de programmation
    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
    class Nom_Relation(object):
    ...      def __init__(self):
                  x = []
                  y = [[]] * len(x)
    ...      def ajouterNom(self):
                  n = input("Entrez un nom : ")
                  if n in x:
                          print ("Attention! Ce nom existe deja.")
                          n = input("Entrez un nouveau nom : ")
                          x.append(n)
    ...      def afficher(self):
                  print (x)
                  print (y)
    >>>
    >>>
    >>> G = Nom_Prenom()
    Voilà j'ai fait comme vous m'avez conseillé (VinsS et Alex) en remplaçant la boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      while i < len(x) - 1 :
                          if x[i] != y[i]:
                               y.append([ ])
                                i = i + 1
    par :
    Cela allège effectivement l'ensemble. Je suis peut être en train de m'emballer et je ferai mieux de commencer à la base et d'apprendre étape par étape mais pourriez-vous déjà me signaler les problèmes de l'algorithme et me montrer comment le tester. Ce sera au moins ça de gagné au fur et à mesure que j'avance. Merci

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 31
    Points : 13
    Points
    13
    Par défaut Petit problème de programmation
    J'ai laissé une erreur à la ligne 16 :

    Logiquement ça devrait être :


  11. #11
    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,

    Lorsque tu fais G = Nom_Relation() tu crée simplement une instance, nommée G de ta classe Nom_Relation

    Python exécutera d'office la fonction __init__() mais uniquement celle-la, pour les autres, il faut les appeler avec l'instance.

    exemple, si tu veux entrer cinq nouveaux noms:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    G = Nom_Relation()
     
    for i in range(5):
        G.ajouterNom()
    après cela viendra une erreur:
    x est inconnu dans l'espace de nom de cette fonction, il aurait fallu en conserver une référence dans la fonction __init__(self)
    en faisant simplement ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    self.x = []
    self.y = [[]] * len(x)
    et plus loin:
    Pareil dans la fonction afficher.

  12. #12
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Attention,
    n'est pas identique à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    y = [[] for _ in range(len(x))]
    Et c'est en général le comportement de ce second code qui est souhaité...

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 31
    Points : 13
    Points
    13
    Par défaut Petit problème de programmation
    Je confirme Dividee,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.y = [[]] * len(x) # proposition de VinsS
    ne fonctionne pas. J'ai un message d'erreur : global name 'x' is not defined

    Donc x n'est pas défini et par contre si je mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.y = [[]] * len(self.x)
    j'ai le résultat suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> G = Nom_Relation()
    >>> G.ajouterNom()
    Entrez un nom : a
    >>> G.ajouterNom()
    Entrez un nom : b
    >>> G.ajouterNom()
    Entrez un nom : c
    >>> G.afficher()
    ['a','b','c']         # La liste x a bien trois éléments
    []                    # La liste y n'a aucun élément
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.y = [[] for _ in range(len(self.x))]
    donne le même résultat.

    comment faire alors pour que chaque élément de x soit représenté par une liste vide dans y?

  14. #14
    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
    Citation Envoyé par selver057 Voir le message
    Je confirme Dividee,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.y = [[]] * len(x) # proposition de VinsS
    ne fonctionne pas. J'ai un message d'erreur : global name 'x' is not defined
    Ca, c'est ce que je t'explique dans le poste #11

    Citation Envoyé par selver057 Voir le message
    Donc x n'est pas défini et par contre si je mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.y = [[]] * len(self.x)
    j'ai le résultat suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> G = Nom_Relation()
    >>> G.ajouterNom()
    Entrez un nom : a
    >>> G.ajouterNom()
    Entrez un nom : b
    >>> G.ajouterNom()
    Entrez un nom : c
    >>> G.afficher()
    ['a','b','c']         # La liste x a bien trois éléments
    []                    # La liste y n'a aucun élément
    Oui j'avais remarqué que ta liste y ne servait strictement à rien, lorsque elle est instanciée, x = 0, donc ...

    Citation Envoyé par selver057 Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.y = [[] for _ in range(len(self.x))]
    donne le même résultat.

    comment faire alors pour que chaque élément de x soit représenté par une liste vide dans y?
    rajouter une [] dans self.y à chaque appel de ajouterNom().

Discussions similaires

  1. Algorithme, petit problème mathématique
    Par GoustiFruit dans le forum Débuter
    Réponses: 8
    Dernier message: 23/06/2009, 15h01
  2. Petit problème avec l'algorithme de Dijkstra
    Par Raiden1234 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 28/11/2008, 16h22
  3. Réponses: 17
    Dernier message: 13/07/2004, 20h37
  4. petit problème premier plan, arrière plan
    Par gros bob dans le forum OpenGL
    Réponses: 4
    Dernier message: 19/04/2004, 12h00
  5. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 18h55

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