2
votes

Python Get Sibling dans la structure JSON

Disons que j'ai le objectif et que je veux le cible . Comment allez-vous parcourir cela et obtenir la valeur cible souhaitée (donnée par exemple A1) dans une seule ligne. J'obtiens les données du fichier sans problème en utilisant json.load(json_data)

Le JSON

{
  "conservative": {
    "goal": "A1",
    "target" : 60000,
    "oneoff": 6000,
    "regular": 600
  },
  "moderate": {
    "goal": "A2",
    "target": 70000,
    "oneoff": 7000,
    "regular": 710
  },
  "optimistic": {
    "goal": "A3",
    "target": 80000,
    "oneoff": 8000,
    "regular": 800
  }
}


0 commentaires

3 Réponses :


4
votes

Vous pouvez peut-être essayer d'utiliser ce qui suit pour obtenir la liste des cibles qui peuvent correspondre aux valeurs d'entrée ( si une seule valeur attendue, vous pouvez simplement mettre [0] à obtenir des éléments uniques de la liste ). Par exemple. avec goal_val = 'A1' :

target = [val['target'] for _, val in my_data.items() if val['goal'] == goal_val]


1 commentaires

Cette réponse pourrait être améliorée en utilisant next () avec une expression de générateur, au lieu d'une compréhension de liste, pour éviter toute autre itération après avoir trouvé le bon objectif.



1
votes

Ci-dessous le code mon ami:

data = {
  "conservative": {
    "goal": "A1",
    "target" : 60000,
    "oneoff": 6000,
    "regular": 600
  },
  "moderate": {
    "goal": "A2",
    "target": 70000,
    "oneoff": 7000,
    "regular": 710
  },
  "optimistic": {
    "goal": "A3",
    "target": 80000,
    "oneoff": 8000,
    "regular": 800
  }
}

goal_required = 'A1'

for obj in data:
    if data[obj]['goal'] == goal_required:
        target = data[obj]['target']
        print("Object {} with the goal {} needs a target of {}".format(obj, goal_required, target))

Ce qui donne la sortie:

Un objet conservateur avec l'objectif A1 a besoin d'une cible de 60000


0 commentaires

2
votes

Voici une solution simple en une ligne:

match = next(v for k, v in d.items() if v['goal'] == goal)
# match == {"goal": "A1", target: 60000, ...}

Ceci utilise une expression de générateur pour éviter d'exécuter plus d'itérations que nécessaire. next () s'assurera que vous n'obtiendrez qu'une seule valeur renvoyée.

Cela pourrait facilement être modifié pour renvoyer le dictionnaire complet correspondant à la place:

d = {
  "conservative": {
    "goal": "A1",
    "target" : 60000,
    "oneoff": 6000,
    "regular": 600
  },
  "moderate": {
    "goal": "A2",
    "target": 70000,
    "oneoff": 7000,
    "regular": 710
  },
  "optimistic": {
    "goal": "A3",
    "target": 80000,
    "oneoff": 8000,
    "regular": 800
  }
}

goal = "A1" # <-- Your goal here

target = next(v['target'] for _, v in d.items() if v['goal'] == goal)
# target == 60000


0 commentaires