Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#1 Sun 16 June 2019 18:39

François063
Participant occasionnel
Lieu: aubieres
Date d'inscription: 20 Nov 2008
Messages: 11

QGIS: PyQGIS parcours des dictionnaires

Bonjour,

débutant sous QGIS et en python, je bute sur des règles de base notamment lors de la recherche, le parcours d'un dictionnaire

j'utilise actuellement la version 3.5 de QGIS au travers de "Script Runner" dans sa version 3.0.5

j'ai constitué un dictionnaire "List" contenant comme clefs des Tuples (Couche,Champ) et comme contenu, des infos sur le champ concerné sous forme de liste ex:
{('BDI_PLU', 'CODE_INSEE'): 'Champ,1,CODE_INSEE,String,5\n'}

Les Couches sont multiples tout comme les Champs

Les traitement précédents m'ont permis d'isoler cette Table 'BDI_PLU' pour laquelle j’attends un champ 'CODE_INSEE' qui est absent de la Table analysée

Je veux rechercher dans dans mon Dictionnaire "List" s'il existe (1 ou plusieurs) occurrences de la clef 'BDI_PLU' sans me préoccuper de la clef 'Champ' (dont je ne connais en théorie pas encore le détail) et si il en existe une, alors j'irai les parcourir une à une et les tracerai dans un fichier texte

Le code tel que je l'ai écrit ne lève plus d’exception mais n'identifie toujours pas la clef 'BDI_PLU' qui est pourtant présente dans le dictionnaire
(le for sera à corriger, une fois que le if sera vrai, mais je n'en suis pas encore là...) 

Code:

if ca.name() in List:
        orapport.write("il reste au moins un couple " + ca.name() + "/champ.name() dans List")
        print("il reste au moins un couple " , ca.name() , "/champ.name() dans List")
        for clef in List[(ca.name(),clef)]:
          print (List[(ca.name(), clef)])
          orapport.write(List[(ca.name(), clef)])
      else:
        print("il ne reste aucun couple non visité pour " , ca.name() , " dans List")

Je ne comprends pas pourquoi ca.name() qui contient 'BDI_PLU' n'est pas détecté dans "List" et me renvoie sur le else: "il ne reste aucun couple non visité pour " , ca.name() , " dans List"

Je pressent qu'un examen de tous les Tuples est nécessaire avant de tenter le 'in' sur List. Mais si tel était le cas, le in n'aurait plus d'intérêt selon moi

En vous remerciant pas avance pour vos éclairages

Cordialement

Dernière modification par François063 (Sun 16 June 2019 18:46)

Hors ligne

 

#2 Tue 18 June 2019 15:00

Mathieu CHAILLOUX
Juste Inscrit !
Date d'inscription: 10 Jul 2017
Messages: 4

Re: QGIS: PyQGIS parcours des dictionnaires

Bonjour,

Quelques remarques tout d'abord :
- si la structure est un dictionnaire, autant l'appeler dict plutôt que List
- par convention le nom d'une variable doit commencer par une minuscule (enfin c'est mieux)
- faites attention à votre indentation quand vous postez du code, le else est décalé et peut s'appliquer au if ou au for
- dans un dictionnaire, la clé est unique et permet d'accéder à la valeur, l'avantage de cette structure est d'accéder rapidement à la valeur en connaissant la clé, ce n'est donc pas forcément une bonne idée de vouloir séparer la clé en 2 parties (couche / champ)

Maintenant pour répondre à vos interrogations, le if ne fonctionne pas car vous testez s'il existe une clé k telle que k = 'BDI_PLU' or toutes les clés sont des tuples (couche,champ) donc structurellement différents.

Le for est effectivement à revoir car vous utilisez la variable 'clef' avant de la définir.

Une idée de code (en remplaçant List par dict) :

Code:

for (k_layer, k_field), v in dict.items():
    if k_layer == ca.name():
        orapport.write(v)

Hors ligne

 

#3 Fri 21 June 2019 08:41

François063
Participant occasionnel
Lieu: aubieres
Date d'inscription: 20 Nov 2008
Messages: 11

Re: QGIS: PyQGIS parcours des dictionnaires

Merci beaucoup pour vos ?l?ments de r?ponse,

J'ai test? votre proposition et effectivement j'arrive ? mes fin

Pour faire suite ? vos remarques j'ai voulu exp?rimenter un dictionnaire de dictionnaire
k_field[nom champ] =d?tail de chaque champ
k_layer[nomlayer] = {k_field}

j'arrive ? le constituer, mais cette fois-ci je bute sur la mani?re de parcourir ce dictionnaire

Lorsque je supprime la derni?re des clefs d'un des kfield, cela supprime-t-il la clef correspondante dans k_layer ou doit-je aller supprimer la klayer[nomlayer] qui ne contient plus rien ?

comment dois-je parcourir ce dictionnaire pour:
identifier les nomlayer restants et dans la foul?e lire les k_field[nomchamp] qu'il contient encore ?

Cordialement

Hors ligne

 

Pied de page des forums

Powered by FluxBB