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 de dictionnaire


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Infographiste 2D-3D
    Inscrit en
    Février 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Infographiste 2D-3D
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Problème de dictionnaire
    Bonjour, débutant an python et nouveau sur ce forum, j'ai entrepris d'apprendre ce langage pour l'adapter par la suite à mes besoins sur Blender.

    Voici l'obstacle que je ne parviens pas à résoudre seul :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    # création d'une map par génération de cube
    
    # création de la classe des carrés
    class carre:
    	def __init__ (self, nom, posx, posy, nature):
    
    		self.nom = nom
    		self.posx = posx
    		self.posy = posy
    		self.nature = nature
    
    # définir la taille de la map
    
    maptail= input ("nombre de carré : ")
    mapsize = int(maptail) * int(maptail)
    
    # paramètres invariables
    
    cubename = "cube"
    tailX = maptail
    tailY = maptail
    
    # création du dico des carrés
    
    dico = {}
    
    # creation des noms des cubes pour les classes et le dico
    
    print ("la carte va avoir {0} cubes de côté, pour un total de {1} cubes".format(maptail, mapsize))
    print("")
    
    for i in range (int(mapsize)):
    
    	nom = (str(cubename)+str(i+1))
    	carre.nom = str(nom)
    	carre.posx = 0 + i
    	carre.posy = 0 + i
    	carre.nature = "sable"
    
    	print ("{0} est en posX {1}, en posY {2} et de nature: {3}".format (carre.nom, carre.posx, carre.posy, carre.nature))
    	dico[nom] = carre (nom, posx, posy, nature)
    La ligne en rouge est à l'origine du problème de mon script, et malgré de nombreux essais je ne parviens pas à franchir cette étape qui devrait normalement voir à chaque boucle ajouter une entrée de type "carre()" à mon dico{} en l'indexant par nom = (str(cubename)+str(i+1))
    j'espère me faire comprendre, mes connaissances étant minces et mon jargon pythonien pas plus épais.

    Merci pour votre aide ! Laurent

  2. #2
    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
    Salut,

    Ca plante parce que l'interpréteur se retrouve avec des variables "posx", "posy", "nature"... indéfinies.
    Votre code a définit ce qu'on appelle des "attributs de classe" carre.posx, carre.posy,... mais ce n'est probablement pas ce que vous vouliez.
    Ecrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for i in range (int(mapsize)):
     
    	nom = (str(cubename)+str(i+1))
    	nom = str(nom)
    	posx = 0 + i
    	posy = 0 + i
    	nature = "sable"
     
    	print ("{0} est en posX {1}, en posY {2} et de nature: {3}".format (
                nom, posx, posy, nature))
    	dico[nom] = carre (nom, posx, posy, nature)
    et laissez le constructeur de "carre" créer les attributs de l'instance (qui pourront être accédés via machin.posx,...).

    Et si vous n'êtes pas à l'aise avec la différence entre variables et attributs, il sera bénéfique de revoir les chapitres correspondants de votre tutoriel favori.

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

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Amateur
    Inscrit en
    Janvier 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Janvier 2015
    Messages : 24
    Points : 34
    Points
    34
    Par défaut
    Bonsoir camarade blenderien,

    Ton code doit plutôt s'écrire comme ça:

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    # création d'une map par génération de cube
     
    # création de la classe des carrés
    class Carre:
    	def __init__ (self, nom, posx, posy, nature):
     
    		self.nom = nom
    		self.posx = posx
    		self.posy = posy
    		self.nature = nature
     
    # définir la taille de la map
     
    maptail= input ("nombre de carré : ")
    mapsize = int(maptail) * int(maptail)
     
    # paramètres invariables
     
    cubename = "cube"
    tailX = maptail
    tailY = maptail
     
    # création du dico des carrés
     
    dico = {}
     
    # creation des noms des cubes pour les classes et le dico
     
    print ("la carte va avoir {0} cubes de côté, pour un total de {1} cubes".format(maptail, mapsize))
     
    for i in range (int(mapsize)):
     
    	nom = cubename+str(i)	
    	posx = i
    	posy = i
    	nature = "sable"
     
    	print ("{0} est en posX {1}, en posY {2} et de nature: {3}".format (nom, posx, posy, nature))
    	dico[nom] = Carre(nom, posx, posy, nature)
    Si tu veux un exemple de jeu de la vie dans Blender, j'avais fait un truc sur la base du code de quelqu'un:

    http://www.pasteall.org/blend/32798

    Bon tu verras c'est pas très bien organisé: Il n'y a pas de classe ou ce genre de choses mais le principe est là.

    Ah oui, et là tu pars en diagonale alors que je suppose que tu veux faire une map carrée:

    Il faut faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for x in range(mapSize):
        for y in range(mapSize):
            nom...
            posx = x
            posy = y
            dico[nom] = Carre(...)
    Autre chose: On ne peut pas trop se servir d'input dans le blender game engine (il faut se servir d'un objet texte).

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Infographiste 2D-3D
    Inscrit en
    Février 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Infographiste 2D-3D
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci pour l'aide, j'ai vu et compris mes erreurs. Pour le moment, avant de franchir le pas et de convertir mes scripts sous Blender, je me cantonne à tester la théorie comme ça, je n'ai pas assez d'heures de vol sous python pour me lancer dans un vrai projet. cela dit, pièce de puzzle par pièce de puzzle, qui sait !

    Encore un grand merci, je vais enfin pouvoir poursuivre et continuer à travailler ce script.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Infographiste 2D-3D
    Inscrit en
    Février 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Infographiste 2D-3D
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci j'ai fini, avec votre aide à corriger mes erreurs et donc je suis parvenu à indexer(?) mon dico grâce à vos conseils.
    Voici donc la version opérationnelle pour ceux que ça peut aider:
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    # création d'une map par génération de cube
     
    # création de la classe des carrés
    class carre:
    	def __init__ (self, nom, posx, posy, nature):
     
    		self.nom = nom
    		self.posx = posx
    		self.posy = posy
    		self.nature = nature
     
    # définir la taille de la map
     
    maptail= input ("nombre de carré : ")
    mapsize = int(maptail) * int(maptail)
     
    # paramètres invariables
     
    cubename = "cube"
    tailX = maptail
    tailY = maptail
     
    # création du dico des carrés
     
    dico = {}
     
    # creation des noms des cubes pour les classes et le dico
     
    print ("la carte va avoir {0} cubes de côté, pour un total de {1} cubes".format(maptail, mapsize))
    print("")
     
    for i in range (int(mapsize)):
     
    	nom = (str(cubename)+str(i+1))
    	nom = str(nom)
    	posx = 0 + (i+1)
    	posy = 0 + (i+1)
    	nature = "sable"
     
    	print ("{0} est en posX {1}, en posY {2} et de nature: {3}".format (nom, posx, posy, nature))
    	dico[nom] = carre (nom, posx, posy, nature)

    @youle31 la double boucle i & j est effectivement la solution la plus adaptée à ce que je souhaite réaliser, à savoir un tableau avec des coordonnées X et Y, en évoquant ça tu as anticipé la suite de mon script où j'ai intégré la double boucle, hélas la console me renvoie un problème d'indentation que j'essaye pour le moment de résoudre décidement...

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    # création d'une map par génération de cube
     
    # création de la classe des carrés
    class carre:
    	def __init__ (self, nom, posx, posy, nature):
     
    		self.nom = nom
    		self.posx = posx
    		self.posy = posy
    		self.nature = nature
     
    # définir la taille de la map
     
    maptail= input ("nombre de carré : ")
    mapsize = int(maptail) * int(maptail)
     
    # paramètres invariables
     
    cubename = "cube"
    tailX = maptail
    tailY = maptail
     
    # création du dico des carrés
     
    dico = {}
     
    # creation des noms des cubes pour les classes et le dico
     
    print ("la carte va avoir {0} cubes de côté, pour un total de {1} cubes".format(maptail, mapsize))
    print("")
    # Une première boucle pour énumérer les colonnes
    for i in range (int(maptail)):
        # Une deuxième pour énumérer les lignes
        for j in range (int(maptail)):
            # Le calcul du nom
            nom = (str(cubename) + "X" + str(i) + "Y" + str(j))
            nom = str(nom)
    	posx = i
    	posy = j
    	nature = "sable"
    	#print ("{0} est en posX {1}, en posY {2} et de nature: {3}".format (nom, posx, posy, nature))
    	dico[nom] = carre (nom, posx, posy, nature)

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

    Le message d'erreur d'indentation t'indique le numéro de ligne où l'erreur est présente.
    je pense que tu as un mélange d'espaces et tabulations.

    Autre chose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for i in range (int(maptail)):
        # Une deuxième pour énumérer les lignes
        for j in range (int(maptail)):
            # Le calcul du nom
            nom = (str(cubename) + "X" + str(i) + "Y" + str(j))
            nom = str(nom)
    	    posx = i        # !! tabulations à partir d'ici !!
    	    posy = j
    	    nature = "sable"
    	    #print ("{0} est en posX {1}, en posY {2} et de nature: {3}".format (nom, posx, posy, nature))
    	    dico[nom] = carre (nom, posx, posy, nature)
    quelle différence avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for i in range (int(maptail)):
        for j in range (int(maptail)):
            nom = "cubeX%sY%s" %(i, j)
            dico[nom] = carre (nom, i, j, "sable")
    ?

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Amateur
    Inscrit en
    Janvier 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Janvier 2015
    Messages : 24
    Points : 34
    Points
    34
    Par défaut
    J'ai pas l'habitude de travailler avec l'IDLE, mais ce que je fais pour les problèmes d'identation, c'est que je sélectionne tout le code, et je fais Format>untabify region, et ça montre direct ce qui ne va pas (en l'occurrence, il manque des espaces avant les 5 dernières lignes).

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Infographiste 2D-3D
    Inscrit en
    Février 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Infographiste 2D-3D
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    pour ma part on m'a conseillé sublime text 2 à la place de IDLE, je vais voir si il contient un equivalent. merci ;-)

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Infographiste 2D-3D
    Inscrit en
    Février 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Infographiste 2D-3D
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    @VinsS

    pour répondre à ta courte question :"quelle différence avec ceci:"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i in range (int(maptail)):
        for j in range (int(maptail)):
            nom = "cubeX%sY%s" %(i, j)
            dico[nom] = carre (nom, i, j, "sable")
    Je dirai à priori aucune si ce n'est que tu sembles beaucoup, beaucoup, beaucoup plus à l'aise avec le python que moi, mais ces quelques lignes m'ont beaucoup appris et en disent long sur le chemin qu'il me reste à parcourir pour t'arriver à la cheville ! ;-)
    mais puisqu'on y est, je vais faire mon gourmand et en profiter pour reposer une petite question:

    J'ai donc créé (avec votre aide je ne l'oublie pas) un dictionnaire dont les clés ont un peu cette syntaxe cubeX1Y1, cubeX1Y2, cubeX1Y3... etc
    et chaque clé contient plusieurs valeurs (nom, posx, posy, nature)

    du coup j'aimerai pouvoir faire un print de mon dico pour m'assurer que tout est là, je trouve de nombreux exemple sur le net, mais à chaque fois une seule valeur est associée aux clés, et je ne parviens pas à trouver le bon code pour lister mon dico de la façon suivante dans ma console:

    clé 1: cubeX1Y1, posx : 1, posy : 1, nature : neutre
    clé 2: cubeX1Y2, posx : 1, posy : 2, nature : neutre
    clé 3: cubeX1Y3, posx : 1, posy : 3, nature : neutre
    ...

    je pensais que ce petit ajout suffirai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for mapsize in dico.keys():
    	print ("clé :", dico[keys]), " --- valeur :", dico[posx, posy, nature])
    Mais il semblerait que je sois bien naïf.

  10. #10
    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
    dico[keys] ne veut pas dire grand chose, et le dictionnaire ignore la nature des valeurs (posx, posy, nature).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for key in sorted(dico.keys()):
        print('Clé: %s valeur: %s' %(key, dico[key]))

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Infographiste 2D-3D
    Inscrit en
    Février 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Infographiste 2D-3D
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Ah ?

    Pour le coup, j'ai fini par trouver seul :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # ma version
    for key,value in dico.items():
    	print (key)
    	print ("X: " + str(value.posx))
    	print ("Y: " + str(value.posy))
    	print ("Type: " + str(value.nature))
    	print("")
     
    # ta version
     
    for key in sorted(dico.keys()):
        print('Clé: %s valeur: %s' %(key, dico[key]))
    d'autant que sur ma console, ma version me renvoie bien toutes les valeurs alors que sur la tienne il doit s'agir des espaces mémoires aloués (non?)
    Nom : screen.jpg
Affichages : 89
Taille : 78,0 Ko

Discussions similaires

  1. Problème de dictionnaire (enfin je pense).
    Par schtroumpf_grognon dans le forum Général Python
    Réponses: 3
    Dernier message: 03/03/2013, 21h03
  2. [TeXnicCenter] Problème d'installation du dictionnaire français
    Par GDMINFO dans le forum Editeurs / Outils
    Réponses: 2
    Dernier message: 21/06/2011, 14h18
  3. Problème pour définir un dictionnaire de fonctions
    Par rambc dans le forum Général Python
    Réponses: 4
    Dernier message: 20/11/2008, 20h09
  4. Problème sur un dictionnaire : has_key()
    Par Rupella dans le forum Général Python
    Réponses: 2
    Dernier message: 18/10/2008, 18h52
  5. Problème "for" dans dictionnaire de liste
    Par Sayrus dans le forum Général Python
    Réponses: 3
    Dernier message: 15/02/2006, 16h35

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