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 :

Mettre un valeur dans un tableau à 2 dimensions


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 16
    Points : 13
    Points
    13
    Par défaut Mettre un valeur dans un tableau à 2 dimensions
    Bonjour/ bonsoir,
    Je suis en train de faire un programme dans lequel j'ai besoin de mettre une valeur dans un tableau 2D remplis de None.
    Là comme d'habitude je met tab[y][x] = val dans ma fonction. Sauf que ça n'a pas marché. Au lieu d'avoir la valeur seulement en x, y je l'ai dans tous les sous tableaux (je sais pas si on appelle ça comme ça) en x

    Pour faire plus visuel, avec les x = 0 et y = 1, je voulais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    [[None, None, None, None, None, None, None, None, None],
    [1, None, None, None, None, None, None, None, None],
    [None, None, None, None, None, None, None, None, None],
    [None, None, None, None, None, None, None, None, None],
    [None, None, None, None, None, None, None, None, None],
    [None, None, None, None, None, None, None, None, None],
    [None, None, None, None, None, None, None, None, None],
    [None, None, None, None, None, None, None, None, None],
    [None, None, None, None, None, None, None, None, None]]
    Mais a la place j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    [[1, None, None, None, None, None, None, None, None],
    [1, None, None, None, None, None, None, None, None],
    [1, None, None, None, None, None, None, None, None],
    [1, None, None, None, None, None, None, None, None],
    [1, None, None, None, None, None, None, None, None],
    [1, None, None, None, None, None, None, None, None],
    [1, None, None, None, None, None, None, None, None],
    [1, None, None, None, None, None, None, None, None],
    [1, None, None, None, None, None, None, None, None]]
    Voici mon code :
    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 gobanList(taille) :
        gobanListe = [[None]*taille]*taille
        return gobanListe
     
     
    def correspondance(mode, x, y, plateau, symbole):
        if mode == 9:
            xCoord = int(x / 40)
            yCoord = int(y / 40)
            print(xCoord,yCoord)
            plateau[yCoord][xCoord] = symbole
            print(plateau)
     
    plateau = gobanList(9)
    correspondance(9, 0, 40, plateau, 0)
    Voila voila, merci d'avance je sens déjà que la réponse va être très simple mais je n'arrive pas a comprendre ce qui ne va pas

  2. #2
    Membre régulier
    Inscrit en
    Juillet 2013
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 80
    Points : 119
    Points
    119
    Par défaut
    Hello,

    Euh je n'ai pas lu le code mais cela me semble bien compliqué par rapport à votre besoin... what about this ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # Array of array generator
    nrows, ncols=10,10
    m = [[None for i in range(ncols)] for i in range(nrows)]
     
    # Modifying an item
    row, col = 1,0 # Coordinates to modify
    m[row][col]=1
    Remarquez que j'ai mis rows, cols, nrows, ncols pour plus de lisibilité, mais vous pouvez encore réduire ce code à deux lignes uniquement

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

    Le soucis est à la ligne 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
             gobanListe = [[None]*taille]*taille
    La liste interne ([None]*taille) fonctionne normalement.
    Mais cette liste là * taille, c'est une copie de la même liste.

    Pour que ce soient des listes différentes, il faut créer chaque sous liste et l'ajouter au tableau (voir le code de charliemtx).

    Maintenant, un tableau à deux dimensions, c'est un tableau à une dimension où les éléments sont accédés via un couple (i, j).
    Mais derrière, rien ne vous empêche de calculer k = i * M + j du tableau 1D correspondant.

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

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    Merci de votre réponse !
    Je pensais que le *taille allez faire une copie du la 1ère taille fois mais qu'elles serait indépendantes par la suite.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 984
    Points
    30 984
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Gal.o.u Voir le message
    Je pensais que le *taille allez faire une copie du la 1ère taille fois mais qu'elles serait indépendantes par la suite.
    Hé non, Python fonctionne à l'économie. Ecrire x=y avec "y" tableau ne donnera pas deux tableaux mais deux références au même tableau mémoire. Parce que d'une part c'est plus rapide de copier une référence que le contenu d'un tableau tout entier et que d'autre part, dans 90% des cas, cela suffit. Mais (revers de la médaille) toute modification dans "x" se répercute dans "y" puisqu'en réalité "x" et "y" ne sont qu'un seul et même tableau.
    Et pour les cas où il faut deux tableaux distincts, Python offre des syntaxes assez souples pour copier facilement le premier dans le second (exemple x=list(y), x=y[:], x=[i for i in y]) ou, comme ici, créer facilement différents sous-tableaux.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    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
    Citation Envoyé par Gal.o.u Voir le message
    Je pensais que le *taille allez faire une copie du la 1ère taille fois mais qu'elles serait indépendantes par la suite.
    Python est un langage bizarre: des références d'un côté et les objets associés de l'autre.

    L = [None]*taille copie lui aussi des références mais L[i] =... assigne un nouvel objet à la iième position de la liste.
    Alors que L[i][j] modifie le jième élément de la ième liste.... et toutes les entrées de L.

    Difficile de s'en sortir sans créer une nouvelle liste à chaque itération (sans *).

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

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

Discussions similaires

  1. [PHP 7] extraire une valeur dans un tableau à 2 dimensions
    Par laurentSc dans le forum Langage
    Réponses: 3
    Dernier message: 30/03/2020, 07h07
  2. Réponses: 3
    Dernier message: 07/11/2019, 09h31
  3. [XL-2016] Macro pour mettre à jour valeurs dans un tableau
    Par forestlaw dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/05/2018, 21h30
  4. mettre les valeurs dans une tableau
    Par monphp dans le forum VB.NET
    Réponses: 1
    Dernier message: 01/06/2007, 16h51
  5. Réponses: 9
    Dernier message: 05/01/2007, 20h04

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