2017-10-18 12 views
2

J'utilise la compréhension de liste pour une dict imbriquée recherchant les valeurs pour les clés "flow" qui apparaissent dans certains dict mais pas dans tous (dans l'exemple " DE "et" CH ", mais pas" FR "). S'il n'existe pas, il devrait ignorer cette dictée et passer au dict suivant.Trouver la valeur de la clé dans Dict imbriqué dans la compréhension de la liste si la clé est disponible

Mes données:

dict_country_data = 
    {"DE": 
    { 
     "location": 
      "europe", 
     "country_code": 
      "DE", 
     "color": 
      {"body": 37647, "wheels": 37863}, 
     "size": 
      {"extras": 40138}, 
     "flow": 
      {"abc": 3845, "cdf": 3844} 
    }, 
    "FR": 
     {"location": "europe", 
     "country_code": "FR", 
     "color": 
      {"body": 219107, "wheels": 39197}, 
     "size": 
      {"extras": 3520} 
     }, 
    "CH": 
     {"location": "europe", 
     "country_code": "CH", 
     "color": {"wheels": 39918}, 
     "size": 
      {"extras": 206275}, 
     "flow": 
      {"klm": 799, "sas": 810} 
     } 
} 

Ma tentative:

[dict_country_data[k]["flow"].values() if dict_country_data[k]["flow"].keys() else None for k,v in dict_country_data.items()] 

Cependant, en dépit de l'instruction if, Python déclenche une NamError (NameError: ne définit pas le nom 'flux').

Mon aspiraient sortie:

[3845, 3844, 799, 810] 

Merci de votre patience et serviabilité.

Répondre

0

Vous n'obtenez pas d'erreur NameError, mais une erreur KeyError, car vous essayez d'accéder à la clé "flow" pour chaque entrée. Au lieu de mettre tout dans une compréhension de la liste, utilisez un for -loop, qui est plus lisible:

flows = [] 
for data in dict_country_data.values(): 
    if "flow" in data: 
     flows.extend(data["flow"].values()) 
1

La manière habituelle de « aplatir » comme celui-ci est une compréhension imbriquée:

[v for country, data in dict_country_data.items() for v in data['flow'].values()]