0
votes

Dans une liste de dictionnaires, traitement de toutes les paires clé-valeur par itération

Ayant des problèmes pour analyser une liste de dictionnaires, accéder à toutes les paires clé-valeur par dictionnaire, via une boucle afin de traiter chaque k-v à la fois.

J'ai un fichier json qui consiste en une liste de dictionnaires. Sous forme simplifiée:

  Traceback (most recent call last):
  File "somescript.py", line 26, in <module>
    print(i, dat[i])
TypeError: list indices must be integers or slices, not dict

Je veux parcourir ce par dictionnaire, et pour chaque paire clé-valeur (à l'exclusion de la première, en supposant qu'elle sera ignorée car la clé est empty) par itération, ayant accès aux paires a, b, c kv d'un dict, afin qu'elles soient traitées individuellement.

J'ai essayé:

import json

with open("file.json", "r") as read_file:
data = json.load(read_file)

for i in data:
    print(i, data[i])

Mais j'obtiens l'erreur suivante:

Traceback (most recent call last):
  File "somescript.py", line 28, in <module>
    for k, v in enumerate(result_list.items()): 
AttributeError: 'list' object has no attribute 'items'

En attendant, j'ai essayé:

import json

with open("file.json", "r") as read_file:
    data = json.load(read_file)

    result_list = []
    for d in data:
        result_list.append([v for k,v in d.items()])

    for k, v in enumerate(result_list.items()): 
        # process each key-value pair

Et obtenez:

[
{"": "0", "a": "3893", "b": "2389", "c": "1209"}, 
{"": "1", "a": "4308", "b": "4560", "c": "9127"},
... 
] 

Le code est défectueux, je ne sais pas encore comment réaliser ce qui précède, c'est peut-être simple mais je ne l'ai pas encore trouvé.


7 commentaires

Il existe plusieurs erreurs de syntaxe dans vos données et votre code. Veuillez publier le code que vous avez réellement testé.


Quoi qu'il en soit, en supposant des correctifs raisonnables à votre message, result_list est une liste de listes contenant les valeurs de chaque dictionnaire. Une liste n'a pas de méthode items . Supprimez simplement .items () si vous souhaitez l'itérer.


Vos éléments 'c' dans le dictionnaire ne sont pas séparés par : ; avez-vous le code que vous utilisez?


Merci! Oui, quelques erreurs, j'ai fait des corrections, mais les données et le code utilisés sont des copies presque exactes de l'original. Le code est 1 contre 1.


Alors, comprenez-vous ce que signifient les messages d'erreur? Parce qu'ils sont assez clairs si vous connaissez du vocabulaire python. Sinon, qu'est-ce que vous ne comprenez pas?


"Je veux parcourir ceci par dictionnaire, et pour chaque paire clé-valeur" Cela suggère que vous avez besoin d'une boucle imbriquée.


Merci. Aussi à Blorgbeard. Je comprends la plupart des termes, mais pas toutes leurs implications.


3 Réponses :


1
votes

La première partie de votre problème est dans votre appel d'énumération:

for item in data:
    for key in item:
        print(key, item[key])

Vous n'invoquez pas .items () sur la liste_résultats; enumerate le consomme sous forme de liste.

Pour répondre au deuxième de vos problèmes:

import json

with open("file.json", "r") as read_file:
data = json.load(read_file)

for i in data:
    print(i, data[i])

En supposant que json est une liste de dictionnaires comme vous l'avez utilisé , vous devrez:

    for k, v in enumerate(result_list): # take off the .items())
        # process each key-value pair

pour tenir compte du double déréférencement.


0 commentaires

0
votes

Vous devriez pouvoir charger la liste entière sans la reconstruire simplement en utilisant json.load , puis itérer dessus et les dicts

with open("file.json", "r") as read_file:
    data = json.load(read_file)

    for _id, item in data.items():
        for k, v in item.items():
            print(_id, k, v)

Cela dit, je suggère vous enregistrez le fichier en tant que fichier JSON normal car il semble que la première clé / valeur de chaque dict est censée être un champ ID , il devrait donc ressembler à ceci:

with open("file.json", 'w') as out_file:
    json.dump({d.pop(""): d for d in data}, out_file, indent=4)


2 commentaires

D'après ce que je peux dire, l'entrée est un tableau d'objets JSON, pas un fichier avec un objet par ligne.


Oui, j'ai réalisé que, réparant



0
votes
for d in data:
    for k, v in d.items():
        # process each key-value pair

1 commentaires

Merci, cela a parfaitement fonctionné et c'est exactement ce que j'ai essayé de faire. Merci beaucoup!