Encore nouveau pour Python et besoin d'un peu d'aide ici. J'ai trouvé quelques réponses pour parcourir une liste de dictionnaires mais pas pour les dictionnaires imbriqués dans une liste de dictionnaires.

Voici la structure approximative d'un dictionnaire unique dans la liste des dictionnaires

[{ 'a':'1',
'b':'2',
'c':'3',
'd':{ 'ab':'12',
      'cd':'34',
      'ef':'56'},
'e':'4',
'f':'etc...'
}]



dict_list = [{ 'a':'1', 'b':'2', 'c':'3', 'd':{ 'ab':'12','cd':'34', 'ef':'56'}, 'e':'4', 'f':'etc...'}, { 'a':'2', 'b':'3', 'c':'4', 'd':{ 'ab':'23','cd':'45', 'ef':'67'}, 'e':'5', 'f':'etcx2...'},{},........,{}]

C'est plus ou moins ce que je regarde, bien qu'il existe des clés avec des listes en tant que valeurs au lieu d'un dictionnaire, mais je ne pense pas que je doive m'en inquiéter pour le moment, même si du code qui les intercepterait serait génial.

Voici ce que j'ai jusqu'à présent qui fait un excellent travail d'itération à travers le json et de retour de toutes les valeurs pour chaque touche de «haut niveau».

import ujson as json

with open('test.json', 'r') as f:
    json_text = f.read()

dict_list = json.loads(json_text)

for dic in dict_list:
    for val in dic.values():
        print(val)

Voici le premier ensemble de valeurs qui sont retournées lorsque cette boucle s'exécute

1
2
3
{'ab':'12','cd':'34','ef':'56'}
4
etc...

Ce dont j'ai besoin pour pouvoir choisir des valeurs spécifiques du niveau supérieur et aller un niveau plus loin et récupérer des valeurs spécifiques dans ce dictionnaire imbriqué et les ajouter à une ou plusieurs listes. Je suis sûr qu'il me manque une solution simple. Peut-être que je regarde plusieurs boucles?

2
MixedBeans 15 mars 2019 à 18:30

2 réponses

Meilleure réponse

Que diriez-vous de vérifier le type d'instance à l'aide de isinstance (bien sûr, cela ne fonctionne que pour un niveau plus profond). Ce n'est peut-être pas le meilleur moyen

for dic in dict_list:
    for val in dic.values():
        if not isinstance(val, dict):
            print(val)
        else:    
            for val2 in val.values():
                print (val2)

# 1
# 2
# 3
# 12
# 34
# 56
# 4
# etc...
# 2
# 3
4
Sheldore 15 mars 2019 à 15:35

En suivant le style ducktype encouragé avec Python, devinez simplement que tout a un membre .values, et attrapez-le s'il ne le fait pas:

import ujson as json

with open('test.json', 'r') as f:
    json_text = f.read()

dict_list = json.loads(json_text)

for dic in dict_list:
    for val in dic.values():
        try:
            for l2_val in val.values():
                print(l2_val)
        except AttributeError:
            print(val)

La solution de Bazingaa serait plus rapide si les dictionnaires internes devaient être rares.

Bien sûr, plus "profond" et vous auriez probablement besoin d'une récursivité:

def print_dict(d):
    for val in d.values():
       try:
           print_dict(val)
        except AttributeError:
           print(val)
4
kabanus 15 mars 2019 à 15:37