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 syntaxe avec un dictionnaire


Sujet :

Python

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 10
    Par défaut Problème de syntaxe avec un dictionnaire
    Bonjour !

    Je vous explique la situation : j'ai un dictionnaire dans lequel je définis des "plot" comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dproie['proie%s' %(u)], = plot(j,taille-1-i,'o',color='b')
    Mon but est de pouvoir retirer un élément de ce dictionnaire en fonction des coordonnées du plot et non pas à partir de la clé.
    Je ne sais pas si cela est possible !

    Merci d'avance et bon après-midi

  2. #2
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Bonjour

    Un élément d'un dictionnaire (donc un couple (key, value)) se supprime via un Il faut donc faire une première passe pour mémoriser/lister les clés correspondant aux valeurs que tu veux supprimer et, dans un second temps, supprimer les éléments.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 10
    Par défaut
    Le problème est que les coordonnées varient (voir ici), et donc que je ne peux pas remonter à la clef à partir des coordonnées...

  4. #4
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Citation Envoyé par Carambarbe Voir le message
    Le problème est que les coordonnées varient (voir ici), et donc que je ne peux pas remonter à la clef à partir des coordonnées...
    Il ne s'agit pas de remonter à la clé. Il s'agit de parcourir les couples (key, value), de voir les value que tu veux éliminer et d'utiliser et de stocker key.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Salut,

    Citation Envoyé par Carambarbe Voir le message
    Le problème est que les coordonnées varient (voir ici), et donc que je ne peux pas remonter à la clef à partir des coordonnées...
    Ben vous créez deux dictionnaires:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        for i in range(N) :
            (x,y)=(random.randint(-50,50),random.randint(-50,50))
            xymap[x,y]  = dd['proie%s' %(i)] = mp.plot(x,y,'o',color='b')
            X+=[x]
            Y+=[y]
    Et vous déclarez dd comme weakref.WeakValueDictionary pour que "del xymap[x, y]" détruise aussi l'entrée dans dd.

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

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 10
    Par défaut
    Je ne suis pas sûr d'avoir bien compris...

    J'ai un système proies/prédateurs. À chaque "tour", je fais déplacer les proies, puis les prédateurs, dans une matrice, en parallèle avec un affichage graphique. Lorsqu'un prédateur arrive sur une "case" où une proie se trouve déjà, je voudrais supprimer la proie dans le dictionnaire à partir de ses coordonnées.

    Votre système convient-il à mes attentes ? Mes connaissances sont loin d'être grandioses en dictionnaire... En tout cas merci beaucoup pour votre réactivité !

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Citation Envoyé par Carambarbe Voir le message
    J'ai un système proies/prédateurs. À chaque "tour", je fais déplacer les proies, puis les prédateurs, dans une matrice, en parallèle avec un affichage graphique. Lorsqu'un prédateur arrive sur une "case" où une proie se trouve déjà, je voudrais supprimer la proie dans le dictionnaire à partir de ses coordonnées.

    Votre système convient-il à mes attentes ?
    Pour autant que je comprenne ce que vous racontez, çà le fait.
    Maintenant, à vous de "tester" sur de petits exemples les opérations (cas d'utilisations on dit) que vous voulez réaliser et vérifier que çà le fait (ou pas).
    note: si les weakref vous semblent un peu trop magiques, vous pouvez gérer à la mimine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        for i in range(N) :
            (x,y)=(random.randint(-50,50),random.randint(-50,50))
            name = 'proie%s' %(i)
            plot_xy = mp.plot(x,y,'o',color='b')
            xymap[x,y]  = (name, plot_xy)
            dd[name] = plot_xy
            X+=[x]
            Y+=[y]
    Avec une fonction genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def xymap_delete(x, y):
          name, _ = xymap[x,y]
          del xymap[x,y]
          del dd[name]
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 10
    Par défaut
    Je crois avoir compris comment vous voulez que je résolve mon problème.
    Cependant, les proies bougent au fur et à mesure des tours, et je ne comprends pas comment je peux modifier les coordonnées au fur et à mesure de chaque proie dans xymap dans le code suivant :

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    from matplotlib.pyplot import *
    from numpy import *
    from random import *
    def milieudevie(taille):
        M=zeros((taille,taille))
        return M
     
    def predateur_proie(npre,npro,taille):# génère la matrice repérant la position des animaux au début, 'npre' pour le nombre de prédateurs et 'npro' le nomrbre de proie, 'taille' étant la taille du carré dans lequel les animaux se déplacent
        M=milieudevie(taille)
        while npre>0:
            x=randint(0,taille-1)
            y=randint(0,taille-1)
            if M[x,y]==0:
                M[x,y]=1.1
                npre-=1
        while npro>0:
            x=randint(0,taille-1)
            y=randint(0,taille-1)
            if M[x,y]==0:
                M[x,y]=1
                npro-=1
        return(M)
     
    def deplacementproie(a,b,taille):# fait se déplacer les proies de manière aléatoire autour de leur case, avec bien sur le problème des bords? D2PLACEMENTS MATRICIELS
        x=copy(a)
        y=copy(b)
        if x!=0 and x!=taille-1:
            if y!=0 and y!=taille-1:
                x+=randint(-1,1)
                y+=randint(-1,1)
            if y==0:
                x+=randint(-1,1)
                y+=randint(0,1)
            if y==taille-1:
                x+=randint(-1,1)
                y+=randint(-1,0)
        if x==0:
            if y==0:
                x+=randint(0,1)
                y+=randint(0,1)
            if y==taille-1:
                x+=randint(0,1)
                y+=randint(-1,0)
            else:
                x+=randint(0,1)
                y+=randint(-1,1)
        if x==taille-1:
            if y==0:
                x+=randint(-1,0)
                y+=randint(0,1)
            if y==taille-1:
                x+=randint(-1,0)
                y+=randint(-1,0)
            else:
                x+=randint(-1,0)
                y+=randint(-1,1)
        if x<0 or x>taille-1 :
            x=a
        if y<0 or y>taille-1 :
            y=b
        return(x,y)
     
    def deplacementpred(a,b,taille):# fait se déplacer les proies de manière aléatoire autour de leur case, avec bien sur le problème des bords
        x=copy(a)
        y=copy(b)
        if x!=0 and x!=taille-1:
            if y!=0 and y!=taille-1:
                x+=randint(-1,1)
                y+=randint(-1,1)
            if y==0:
                x+=randint(-1,1)
                y+=randint(0,1)
            if y==taille-1:
                x+=randint(-1,1)
                y+=randint(-1,0)
        if x==0:
            if y==0:
                x+=randint(0,1)
                y+=randint(0,1)
            if y==taille-1:
                x+=randint(0,1)
                y+=randint(-1,0)
            else:
                x+=randint(0,1)
                y+=randint(-1,1)
        if x==taille-1:
            if y==0:
                x+=randint(-1,0)
                y+=randint(0,1)
            if y==taille-1:
                x+=randint(-1,0)
                y+=randint(-1,0)
            else:
                x+=randint(-1,0)
                y+=randint(-1,1)
        if x<0 or x>taille-1 :
            x=a
        if y<0 or y>taille-1 :
            y=b
        return(x,y)
     
    def fonctioncomptagerepro(M,a,b,taille) :
        M1=ones((taille+1,taille+1))
        for i in range(taille):
            for j in range(taille) :
                M1[1+i,1+j]=M[i,j]
        compt=int(M1[a-1,b-1]+M1[a-1,b]+M1[a-1,b+1]+M1[a,b-1]+M1[a,b+1]+M1[a+1,b-1]+M1[a+1,b]+M1[a+1,b+1])  # ????
        return(compt)
     
    def casedispobebe(M,a,b,taille):
        M1=ones((taille+2,taille+2))
        for i in range(taille):
            for j in range(taille):
                M1[1+i,1+j]=M[i,j]
        for x in range(-1,2):
            for y in range(-1,2):
                if M1[a+x,b+y]==0:
                    return(a+x-1,b+y-1) # parcourt toutes les cases autour d'une proie et renvoie la case libre
        return False
     
    def milieudeplacementproie(n,npre,npro,taille): #la fonction permet d'initialiser l'interface graphique et de tester le déplacement
        clf() # EFFACE LA FENETRE DE GRAPHE
        p1=[-0.2,-0.2,taille-0.8,taille-0.8,-0.2]
        p2=[-0.2,taille-0.8,taille-0.8,-0.2,-0.2]
        plot(p1,p2)
        show()
        M=predateur_proie(npre,npro,taille) #on crée la matrice de localisation des proies/prédateurs aléatoirement
        u=npro 
        v=npre
        dproie={} #initialisation du dictionnaire des proies
        dpred={} #initialisation du dictionnaire des prédateurs
        dbebeproie={}
        print(M)
        for i in range(taille):
            for j in range(taille):
                if M[i,j]==1:
                    dproie['proie%s' %(u)], = plot(j,taille-1-i,'o',color='b') #une proie est un point bleu, le %s permet de les différencier           
                    u-=1
                if M[i,j]==1.1: #si il doit avoir un prédateur, alors on en place un (les prédateurs étant considéré par le nombre 1.1)
                    dpred['pred%s' %(v)], = plot(j,taille-1-i,'o',color='r') #une prédateur est un point rouge, le %s permet de les différencier
                    v-=1
        xlim(-0.7,taille-0.3) #on définit la taille du milieu sur le graphique en x
        ylim(-0.7,taille-0.3) #et en y
        show()
        bebeproie=0
        bebepred=0
        A=0
        LX=[]
        LY=[]
        for i in range(n):          #les proies se déplacent n fois 
            for proie in dproie.values() : #pour chaque proie dans le dictionnaire des proies, on effectue le déplacement
                (a,b)=proie.get_data()#on récupère les coordonnées actuelles de la proie
                aaux=copy(a) #on fixe les valeurs de a et b dans des variables auxiliaires
                baux=copy(b)
                (X,Y)=deplacementproie(taille-1-baux,aaux,taille) #on calcule les coordonnées de déplacements
     
                if (X,Y)!=(taille-1-baux,aaux) and M[X,Y]==1 and fonctioncomptagerepro(M,X,Y,taille)<8: #si on rencontre quelqu'un (on vérifie que l'on ne se rencontre pas soi-même)   
                    if casedispobebe(M,X,Y,taille)!=False : 
                        (X1,Y1)=casedispobebe(M,X,Y,taille)
                        M[X1,Y1]=1
                        bebeproie+=1                                   
                        dbebeproie['bebe%s' %(bebeproie)], = plot(Y1,taille-1-X1,'o',color='b') # on ajoute un bébé s'il y a des cases disponibles
                        show()
     
                if M[X,Y]==0: #on vérifie qu'il n'y a pas déjà ni proies ni prédateurs sur la case on veut aller
                    M[X,Y]=1 #on actualise la matrice de localisation des proies/prédateurs
                    M[taille-1-baux,aaux]=0 #idem
                    proie.set_data(Y,taille-1-X) #on déplace la proie
                    show()
                    pause(0.05) #la pause permet de visualiser le déplacement
     
            for pred in dpred.values() : #pour chaque predateur dans le dictionnaire des predateurs, on effectue le déplacement
                (a,b)=pred.get_data()#on récupère les coordonnées actuelles du prédateur
                aaux=copy(a) #on fixe les valeurs de a et b dans des variables auxiliaires
                baux=copy(b)
                (X,Y)=deplacementpred(taille-1-baux,aaux,taille)
     
                if M[X,Y]==1 :
                    M[X,Y]=1.1
                    M[taille-1-baux,aaux]=0 
                    print('ahou')
                    for proie in dproie.values() :
                        if proie.get_data()==(Y,taille-1-X) :
                            print('kaikai')
                    show()
     
                if M[X,Y]==0: #on vérifie qu'il n'y a pas déjà ni proies ni prédateurs sur la case on veut aller
                    M[X,Y]=1.1 #on actualise la matrice de localisation des proies/prédateurs
                    M[taille-1-baux,aaux]=0 #idem
                    pred.set_data(Y,taille-1-X) #on déplace le prédateur
                    show()
                    pause(0.05) #la pause permet de visualiser le déplacement
    Étant donné que j'utilise "for proie in dproie.values()", puis-je remonter au nom spécifique de la proie que je suis entrain d'utiliser ? Dans ce cas là, je pourrais modifier les coordonnées dans xymap.

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Salut,

    Citation Envoyé par Carambarbe Voir le message
    Je crois avoir compris comment vous voulez que je résolve mon problème.
    Cependant, les proies bougent au fur et à mesure des tours, et je ne comprends pas comment je peux modifier les coordonnées au fur et à mesure de chaque proie dans xymap dans le code suivant
    Je n'ai fait qu'essayé de traduire:
    Citation Envoyé par Carambarbe
    J'ai un système proies/prédateurs. À chaque "tour", je fais déplacer les proies, puis les prédateurs, dans une matrice, en parallèle avec un affichage graphique. Lorsqu'un prédateur arrive sur une "case" où une proie se trouve déjà, je voudrais supprimer la proie dans le dictionnaire à partir de ses coordonnées.
    Pour le reste, je ne comprends déjà pas pourquoi vous voulez faire cela avec matplotlib plutôt qu'avec un Canvas "simple"...

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

Discussions similaires

  1. [Python 2.X] Problème de surcharge avec dictionnaire
    Par MrFlash03 dans le forum Général Python
    Réponses: 6
    Dernier message: 21/09/2015, 17h14
  2. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33
  3. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02
  4. [Kylix] problème compilation kylix3 avec redhat 9.0
    Par madininaoursa dans le forum EDI
    Réponses: 1
    Dernier message: 02/07/2003, 16h21
  5. Problèmes de versions avec Xalan, Xerces et Java
    Par honeyz dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 05/06/2003, 10h18

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