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)
{
"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
}
}
3 Réponses :
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]
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.
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
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