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 liste qui se modifie "toute seule"


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 9
    Par défaut Problème liste qui se modifie "toute seule"
    Bonjour à tous,

    Ceci est mon premier post sur le forum,
    je suis tout débutant en programmation et ma question va surement trouver une solution simple, mais je ne la trouve vraiment pas.

    Voilà mon problème :

    J'essaie de faire un programme qui me donne la table des multiplications de Pythagore suivante :

    Nom : tables.jpg
Affichages : 12231
Taille : 75,6 Ko

    Pour cela j'ai codé le programme suivant (table de taille 3 juste pour essayer) :

    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 tablePytha (n):
        a = ['x']
        for u in range(1,n+1):
            a.append(u)
     
        print (a)    
        b = a
     
        for i in range(1,n+1) :
            b[0] = i
            for y in range(1,n+1):
                b[y] = a[y]*a[i]   ###
            print (b)
     
    print(tablePytha(3))
    Seulement il ne marche pas et en vérifiant en lui demandant de me sortir chaque étape, il se trouve qu'à la ligne 12 (###) la liste a se mets à jour et je ne comprend absolument pas pourquoi.
    Evidemment c'est juste que je ne connais pas encore le langage, alors je fais appel à votre aide

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Le problème est dans la ligne "b = a": comme ça, b est seulement une nouvelle façon d'atteindre les données de a!

    Si tu veux faire une copie de a dans b, essaie: b = a[:]. Avec ça, une modification de b n'entrainera pas la même modification de a.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 9
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    Le problème est dans la ligne "b = a": comme ça, b est seulement une nouvelle façon d'atteindre les données de a!

    Si tu veux faire une copie de a dans b, essaie: b = a[:]. Avec ça, une modification de b n'entrainera pas la même modification de a.
    Ah merci c'est bien ça ! J'avais pas entièrement compris la notation b =a

    Et aurais-tu une manière plus simple pour aligner les termes des mes listes à l'affichage que d'y rentrer des espaces (" ") suivant si chaque nombre contient 1,2 ou 3 chiffres ? Parce que cela changerai le nombre de termes de mes listes :/

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Paul_05 Voir le message
    Et aurais-tu une manière plus simple pour aligner les termes des mes listes à l'affichage que d'y rentrer des espaces (" ") suivant si chaque nombre contient 1,2 ou 3 chiffres ? Parce que cela changerai le nombre de termes de mes listes :/
    Dans la mesure où chaque case contient 5 caractères (pour que ça colle avec 1, 10 ou 100 et un espace de chaque côté), on peut faire ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    print(" {:^3} ".format(1))
      1 
    print(" {:^3} ".format(10))
      10 
    print(" {:^3} ".format(100))
     100
    Le '3' dit qu'il y a 3 positions pour afficher le nombre, et '^' est une instruction de centrage du nombre dans ces 3 positions.

    Bien sûr, comme c'est en mode caractères et non en graphique, l'instruction de centrage '^' n'est qu'approximatif: le 1 sera centré puisqu'il y a une largeur d'affichage de 3, mais le 10 restera calé à droite.

    Pour que ce soit centré au pixel près, il faut passer au mode graphique.

  5. #5
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Un résultat sympa ne serait-il pas d'écrire cela dans un tableau csv par exemple ?

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 9
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Un résultat sympa ne serait-il pas d'écrire cela dans un tableau csv par exemple ?
    Sûrement oui, j'essaie quand même de me démerder avec le peu d'outils que je connais, et que je ne maîtrise pas vraiment, avant de passer à autre chose.
    Merci de la réponse en tout cas

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 9
    Par défaut
    Citation Envoyé par tyrtamos Voir le message

    Le '3' dit qu'il y a 3 positions pour afficher le nombre, et '^' est une instruction de centrage du nombre dans ces 3 positions.

    Bien sûr, comme c'est en mode caractères et non en graphique, l'instruction de centrage '^' n'est qu'approximatif: le 1 sera centré puisqu'il y a une largeur d'affichage de 3, mais le 10 restera calé à droite.

    Pour que ce soit centré au pixel près, il faut passer au mode graphique.
    Merci beaucoup pour les précisions !
    je vais pas passer au mode graphique de suite je pense

  8. #8
    Membre émérite
    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
    Par défaut
    Citation Envoyé par Paul_05 Voir le message
    Et aurais-tu une manière plus simple pour aligner les termes des mes listes à l'affichage que d'y rentrer des espaces (" ") suivant si chaque nombre contient 1,2 ou 3 chiffres ? Parce que cela changerai le nombre de termes de mes listes :/
    Bonsoir,
    Pour aligner les nombres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def tablePytha (n):
        lst = [[x*y for x in range(1, n + 1)] for y in range(1, n + 1)]
        return lst
     
    ma_lst = tablePytha(10)
    for lig in ma_lst:
        print(*lig, sep = "\t")
     
    print()
     
    for lig in ma_lst:
        for col in lig:
            print("{:>4}".format(col), end = "")
        print()
    Et donc:
    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
    23
    >>> 
    1	2	3	4	5	6	7	8	9	10
    2	4	6	8	10	12	14	16	18	20
    3	6	9	12	15	18	21	24	27	30
    4	8	12	16	20	24	28	32	36	40
    5	10	15	20	25	30	35	40	45	50
    6	12	18	24	30	36	42	48	54	60
    7	14	21	28	35	42	49	56	63	70
    8	16	24	32	40	48	56	64	72	80
    9	18	27	36	45	54	63	72	81	90
    10	20	30	40	50	60	70	80	90	100
     
       1   2   3   4   5   6   7   8   9  10
       2   4   6   8  10  12  14  16  18  20
       3   6   9  12  15  18  21  24  27  30
       4   8  12  16  20  24  28  32  36  40
       5  10  15  20  25  30  35  40  45  50
       6  12  18  24  30  36  42  48  54  60
       7  14  21  28  35  42  49  56  63  70
       8  16  24  32  40  48  56  64  72  80
       9  18  27  36  45  54  63  72  81  90
      10  20  30  40  50  60  70  80  90 100
    >>>
    Clodion

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2014
    Messages : 54
    Par défaut
    on peut mettre

  10. #10
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 9
    Par défaut
    Citation Envoyé par bosskev62 Voir le message
    on peut mettre
    Merci pour l'aide, c'était bien ça le problème.

    Apparemment b = a[:] est équivalent aussi.

  11. #11
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 9
    Par défaut
    Citation Envoyé par Clodion Voir le message
    Bonsoir,
    Pour aligner les nombres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def tablePytha (n):
        lst = [[x*y for x in range(1, n + 1)] for y in range(1, n + 1)]
        return lst
     
    ma_lst = tablePytha(10)
    for lig in ma_lst:
        print(*lig, sep = "\t")
     
    print()
     
    for lig in ma_lst:
        for col in lig:
            print("{:>4}".format(col), end = "")
        print()
    Clodion
    Merci de la réponse, c'est parfaitement ce que je cherchais
    J'avais pas pensé à créer une liste avec toute l'information, effectivement c'est plus pratique pour l'affichage.

    Normalement j'ai bien compris la deuxième manière d'afficher, juste est-ce que le ' end = "" ' est bien une instruction pour ne pas revenir à la ligne entre chaque 'print' ?

    Par contre la première manière j'ai pas compris la ligne 7 (print(*lig, sep = "\t")), tu peux m'éclairer stp ?

  12. #12
    Membre émérite
    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
    Par défaut
    Citation Envoyé par Paul_05 Voir le message
    Normalement j'ai bien compris la deuxième manière d'afficher, juste est-ce que le ' end = "" ' est bien une instruction pour ne pas revenir à la ligne entre chaque 'print' ?
    Par contre la première manière j'ai pas compris la ligne 7 (print(*lig, sep = "\t")), tu peux m'éclairer stp ?
    Bonsoir,
    La fonction "print" peut prendre des arguments supplémentaires dont:
    - sep: c'est le séparateur entre les expressions à imprimer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> mon_sep = "~~~~~"
    >>> print(1, 2, 3, sep=mon_sep)
    1~~~~~2~~~~~3
    >>>
    Et "\t" dans ce contexte signifie "tabulation". Donc, entre chaque donnée, est insérée une tabulation.

    - end: c'est le séparateur de lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> print(1, 2, 3, sep="", end=mon_sep)
    123~~~~~
    >>> print(1, 2, 3, sep="", end="\n")
    123
    >>> print(1, 2, 3, sep="", end="\n\n")
    123
     
    >>>
    Sinon, beaucoup plus simple: help(print) dans la console…

    Clodion

    PS: print(lst) et print(*lst):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> lst = [x for x in range(10)]
    >>> lst
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> print(lst)
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> print(lst, sep="~~~~~~~")
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>>
    L'astérisque sert à décompacter la liste. C'est "équivalent", dans ce cas, à "print(lst[0], lst[1], lst[2]…)"
    Cela permet d'insérer un séparateur (sep) entre chaque élément.

  13. #13
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Une ide pour t'aider : j'avoue avoir du mal à comprendre ce que tu souhaites ?
    tableau en sortie ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def tablePytha (n):
        for i in range(n):
            for j in range (n):
                print(i, ' x ', j, ' = ', i*j)
     
    tablePytha(10)

  14. #14
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 9
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Une ide pour t'aider : j'avoue avoir du mal à comprendre ce que tu souhaites ?
    tableau en sortie ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def tablePytha (n):
        for i in range(n):
            for j in range (n):
                print(i, ' x ', j, ' = ', i*j)
     
    tablePytha(10)
    Oui c'est l'affichage des tables sous forme de tableau que j'aimerais bien faire.
    Du coup je voulais afficher les lignes successives sous formes de listes, mais c'est peut-être pas le plus judicieux, je débute

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/11/2006, 01h22
  2. Un programme qui se met à jour tout seul
    Par ElbaC dans le forum C++
    Réponses: 6
    Dernier message: 09/06/2006, 11h19
  3. [Formulaire] zone de liste qui en modifie d'autres
    Par dutrannoy dans le forum Access
    Réponses: 4
    Dernier message: 09/10/2005, 20h19

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