Bonjour,

Big picture
Je souhaite alimenter un dictionnaire, sur la base d'un Parser Lexx/Yacc.
Toutefois je vous fais grâce du contenu du Parser.
Et actuellement, il me renvoi bien ce que j'attendais.

Je souhaiterai donc créer ce dictionnaire, via des "pointeurs" (ou référence) pour alimenter chaque valeur de clé, dans les items des listes.
Toutefois, la profondeur de ce dictionnaire sera très variable (selon ce que découvre le Parser).

J'ai donc fait un petit code, qui permet de lire un dictionnaire, pour la simulation du Parser (dict1), afin d'en alimenter un autre.
Mais je suis "sec" sur ce que je dois mettre pour alimenter le second dictionnaire (dict2).
Pour info, je fais très bien cela en Perl, mais là j'avoue être perdu...

Si vous pouviez me mettre sur la bonne piste, je serai un homme heureux

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
 
#!/usr/bin/env python3
import json
 
dict2 = {}
current = { 'pad': 0 }
dict1 = {
   'level1': [
 
      {
         'prp1': 'foo1',
         'prp2': 'bar',
         'prp3': 'zzz',
         'level2': [
            {
               'prp1': 'foo12',
               'prp2': 'bar12',
            },
            {
               'prp1': 'foo13',
               'prp2': 'bar13',
            },
         ],
      },
 
      {
         'prp1': 'foo2',
         'prp2': 'bar',
         'prp3': 'zzz',
         'level2': [
            {
               'prp1': 'foo22',
               'prp2': 'bar22',
            },
            {
               'prp1': 'foo23',
               'prp2': 'bar23',
            },
         ],
      },
 
   ],
}
 
 
def _readList(myList):
   for myItem in myList:
      print("{}{}".format( '   ' * current['pad'], '---' ))
      if isinstance(myItem, dict):
         _readDict(myItem)
 
 
 
 
 
def _readDict(currentDict):
   for k,v in currentDict.items():
      if isinstance(v, list):
         print("{}{}".format( '   ' * current['pad'], k ))
         current['pad']+=1
         _readList(v)
         current['pad']-=1
      else:
         print("{}{}={}".format( '   ' * current['pad'], k, v ))
 
 
_readDict(dict1)
print(json.dumps(dict2))
Note:
Les pad dans les print, sont juste là pour l'indentation de sortie et les tirets pour montrer les ruptures.
Et comme je n'aime pas trop les "global", j'ai mis la valeur du pad, dans in dictionnaire.

Aparté:
Du reste, je trouve plutôt étrange, de permettre, à un dictionnaire ou une liste, d'être "global" et pas une variable?!
Je n'ai peut être pas compris un truc... ?

La sortie donne ceci :
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
 
level1
   ---
   prp1=foo1
   prp2=bar
   prp3=zzz
   level2
      ---
      prp1=foo12
      prp2=bar12
      ---
      prp1=foo13
      prp2=bar13
   ---
   prp1=foo2
   prp2=bar
   prp3=zzz
   level2
      ---
      prp1=foo22
      prp2=bar22
      ---
      prp1=foo23
      prp2=bar23
{}
Merci d'avance de votre aide