#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