2010-02-15 3 views
22

Je suis très novice en Python et en analyse de données.Lecture à partir de Python dict si la clé n'est peut-être pas présente

Je peux extraire un flux JSON externe dans un dictionnaire Python et parcourir le dictionnaire.

for r in results: 
    print r['key_name'] 

Comme je marche à travers les résultats retournés, je reçois une erreur lorsqu'une touche n'a pas de valeur (une valeur ne peut pas toujours exister pour un enregistrement). Si j'imprime les résultats, cela indique que

'key_name': None, 'next_key':................. 

Mon code rompt l'erreur. Comment puis-je contrôler une clé n'ayant pas de valeur?

Toute aide sera grandement appréciée!

Brock

Répondre

66

La manière préférée, le cas échéant:

for r in results: 
    print r.get('key_name') 

cela il suffit d'imprimer None si key_name est pas une clé dans le dictionnaire. Vous pouvez également avoir une valeur par défaut différente, juste passer comme second argument:

for r in results: 
    print r.get('key_name', 'Missing: key_name') 

Si vous voulez faire quelque chose de différent que d'utiliser une valeur par défaut (par exemple, sauter l'impression complètement lorsque la clé est absent), alors vous avez besoin d'un peu plus de structure, à savoir, que ce soit:

for r in results: 
    if 'key_name' in r: 
     print r['key_name'] 

ou

for r in results: 
    try: print r['key_name'] 
    except KeyError: pass 

le second peut être plus rapide (si elle est assez rare qu'une clé est manquante), mais la fi Le premier semble être plus naturel pour beaucoup de gens.

+0

est-il un moyen d'obtenir des sous-clés d'une clé en utilisant obtenir en quelque sorte? – brizz

+0

@brizz, qu'est-ce qu'une "clé secondaire"? –

+1

disons que vous avez un dict, {data: {'moredata': 'value', 'evenmoredata': 'une autre valeur'}}, .get fonctionne pour .get ('data'), mais est-il possible d'accéder .get ('data') ['moredata'] – brizz

0

utilisation has_key(), et retourne vrai ou faux

+7

'd.has_key (k)' est obsolète maintenant. Vous êtes censé utiliser 'k in d' dans le nouveau code. – LeafStorm

0

[Mise à jour pour enlever étourderie]

Vous pouvez aussi faire quelque chose comme ceci:

for r in (row for row in results if 'a' in row): 
    print r['a'] 

Il utilise une expression de générateur pour sélectionner « lignes » de « résultats » où « rangée » comprend la clé "a".

Voici un petit script de test:

results = [{'a':True}, {'b':True}, {'a':True}] 
for r in (row for row in results if 'a' in row): print r['a'] 
+0

'[r.get ('nom_clé') pour r dans les résultats]' – bernie

+0

@Parand: Quelle version de Python avez-vous testée? Vos deux statuts 'for' dessinent un ** SYNTAX ** ** ERROR ** dans Python 2.6 et 3.1. –

+0

Désolé John, c'était une erreur négligente. Correction du script, devrait maintenant fonctionner sur python 2.5+. – Parand

1

Si possible, utilisez la bibliothèque simplejson pour la gestion des données JSON.

0

Il existe deux façons simples de lire à partir de dict Python si la clé peut ne pas être présente.par exemple:

dicty = {'A': 'hello', 'B': 'world'}

  1. La façon pythonique d'accéder à une paire clé-valeur est:

value = dicty.get('C', 'default value')

  1. Le non-pythonique chemin:

value = dicty['C'] if dicty['C'] else 'default value'

  1. encore pire:

try: value = dicty['C'] except KeyError as ke: value = 'default value'

0

Vous pouvez utiliser la fonction intégrée hasattr

key='key_name' 
# or loop your keys 

if hasattr(e, key): 
    print(e[key]) 
else: 
    print('No key for %s' % key) 
Questions connexes