1
votes

Comment gérer les clés de dictionnaire qui n'existent pas dans une boucle?

J'ai essayé d'analyser json et d'utiliser la boucle for en Python. obj est json et comme vous le savez, c'est comme le dictionnaire dans la liste dans le dictionnaire dans le dictionnaire ... et ainsi de suite.

Donc, j'analyse json et en fait une boucle for comme ceci:

for a in all:
    if ['recommendSellerScore'] in all:
        recommendSellerScore.append(a['recommendSellerScore'])
    else:
        continue
        print('None')

Cependant, le problème est 'recommendSellerScore' qui est la clé n'existe pas dans certaines listes.

Ce que je veux en conséquence, c'est imprimer 'None' là où recommendSellerScore n'existe pas, et imprimer les valeurs là où recommendSellerScore existe.

for a in all:
    if a['recommendSellerScore'] in all:
        recommendSellerScore.append(a['recommendSellerScore'])
    else:
        continue
        print('None')

J'ai exécuté ce code ci-dessus, mais j'ai eu une erreur car 'recommendSellerScore' n'existe pas.

all = obj['products']
for a in obj:
      recommendSellerScore.append(a['recommendSellerScore'])

Celui-ci a fonctionné, cependant, puisque 'recommendSellerScore' existe dans la liste du dictionnaire, il n'était pas itérable. (Je suppose)

Veuillez corriger mon code, et tout commentaire ou conseil sera apprécié!


1 commentaires

@hitter merci pour votre réponse. Puis-je savoir comment je peux voter pour les commentaires? Je ne vois qu'un drapeau sur les commentaires.


3 Réponses :


2
votes

Voici la version corrigée de votre code (j'ai retiré l'instruction continue et le [] autour de la chaîne):

for a in all:
    if "recommendSellerScore" in a:
        recommendSellerScore.append(a["recommendSellerScore"])
    else:
        print("None")


6 commentaires

N'utilisez pas "something" in a car il pourrait ne pas fonctionner comme prévu si «quelque chose» est trouvé dans les valeurs. "something" in a.keys() est beaucoup plus sûr et explicite.


@Guimoute vous vous trompez, "something" in a est pareil avec "something" in a.keys()


c'est la meilleure réponse à ce jour;)


@kederrac Mon mal, je me suis mêlé à dictview s. Encore une bonne idée de vérifier explicitement les clés ou les valeurs.


@Guimoute Merci pour vos conseils! Cela fonctionnait avec ".keys ()". Le code que j'utilise comme résultat est: for a in all: if "recommendSellerScore" dans a.keys (): recommendSellerScore.append (a ["recommendSellerScore"]) else: recommendSellerScore.append ("None")


@kederrac Je ne sais pas pourquoi, il me manque peut-être quelque chose dans l'explication, mais cela ne fonctionne qu'avec "quelque chose" dans a.keys (). En tout cas merci pour ton commentaire également! :)



2
votes

Peut-être que quelque chose comme le code ci-dessous fonctionne pour vous?

for a in all:
    if a.get(['recommendSellerScore']) is not None:
        recommendSellerScore.append(a['recommendSellerScore'])
  else:
      print("None")
      # No need for continue here.


4 commentaires

vous ne pouvez pas avoir de listes comme clé dans un dict, votre code doit TypeError: unhashable type: 'list'


vous ne pouvez pas non plus utiliser dict.get avec une liste


L'OP a dit que le obj est JSON -> donc traduit à un dictionnaire, après des charges de JSON


regardez votre premier commentaire que vous envisagez a comme dict



2
votes

Vous pouvez utiliser la méthode get des dictionnaires pour essayer d'accéder à la valeur du dictionnaire, si la clé n'est pas présente, vous pouvez fournir une valeur par défaut, si vous n'en spécifiez pas une, elle affichera None , par exemple:

>>> 1
>>> None 

Edit: comme indiqué par @kederrac si vos données peuvent avoir {key: None} valeurs {key: None} et que vous souhaitez conserver ces valeurs None , il est préférable de demander si la clé est vraiment présente dans le dictionnaire, par exemple:

key = 'recommendSellerScore'
a = [{key: 1}, {key: None}]

recommendSellerScore = []
for d in a:
    if key in d.keys():
        print(d[key])
        recommendSellerScore.append(d[key])
    else:
        print('None')

Il imprimera:

key = 'recommendSellerScore'
a = [{key: 1}, {}]

recommendSellerScore = []
for d in a:
    score = d.get(key)
    if score is not None:
        print(score)
        recommendSellerScore.append(score)
    else:
        print('None')


3 commentaires

et si a = [{key: None}, {}] ? votre code ne parviendra pas à stocker dans recommendSellerScore la valeur None


@kederrac, true, dans ce cas, voir Edit .


si vous avez a = [{key: 1}, {key: None}, {1:1}] ?