Domanda Controlla se una determinata chiave esiste già in un dizionario


Volevo testare se esiste una chiave in un dizionario prima di aggiornare il valore della chiave. Ho scritto il seguente codice:

if 'key1' in dict.keys():
  print "blah"
else:
  print "boo"

Penso che questo non sia il modo migliore per portare a termine questo compito. C'è un modo migliore per testare una chiave nel dizionario?


2176
2017-10-21 19:05


origine


risposte:


in è il modo previsto per verificare l'esistenza di una chiave in a dict.

d = dict()

for i in xrange(100):
    key = i % 10
    if key in d:
        d[key] += 1
    else:
        d[key] = 1

Se si desidera un valore predefinito, è sempre possibile utilizzare dict.get():

d = dict()

for i in xrange(100):
    key = i % 10
    d[key] = d.get(key, 0) + 1

... e se si desidera garantire sempre un valore predefinito per qualsiasi chiave che è possibile utilizzare defaultdict dal collections modulo, in questo modo:

from collections import defaultdict

d = defaultdict(lambda: 0)

for i in xrange(100):
    d[i % 10] += 1

... ma in generale, il in parola chiave è il modo migliore per farlo.


2229
2017-10-21 19:10



Non devi chiamare le chiavi:

if 'key1' in dict:
  print "blah"
else:
  print "boo"

Sarà molto Più veloce poiché usa l'hashing del dizionario invece di fare una ricerca lineare, cosa che farebbero le chiavi di chiamata.


1092
2017-10-21 19:06



È possibile verificare la presenza di una chiave in un dizionario, utilizzando il in parola chiave:

d = {'a': 1, 'b': 2}
'a' in d # <== evaluates to True
'c' in d # <== evaluates to False

Un uso comune per verificare l'esistenza di una chiave in un dizionario prima di mutarlo è quello di inizializzare il valore predefinito (ad es. Se i valori sono elenchi, ad esempio, e si vuole assicurarsi che ci sia una lista vuota alla quale si può aggiungere quando si inserisce il primo valore per una chiave). In casi come questi, potresti trovare il collections.defaultdict() digitare per essere di interesse.

Nel codice precedente, potresti anche trovare alcuni usi di has_key(), un metodo deprecato per verificare l'esistenza delle chiavi nei dizionari (basta usare key_name in dict_name, anziché).


226
2017-10-21 19:16



Puoi abbreviare questo:

if 'key1' in dict:
    ...

Tuttavia, questo è nel migliore dei casi un miglioramento estetico. Perché credi che questo non sia il modo migliore?


74
2017-10-21 19:06



Consiglierei di usare il setdefault metodo invece. Sembra che farà tutto quello che vuoi.

>>> d = {'foo':'bar'}
>>> q = d.setdefault('foo','baz') #Do not override the existing key
>>> print q #The value takes what was originally in the dictionary
bar
>>> print d
{'foo': 'bar'}
>>> r = d.setdefault('baz',18) #baz was never in the dictionary
>>> print r #Now r has the value supplied above
18
>>> print d #The dictionary's been updated
{'foo': 'bar', 'baz': 18}

40
2017-10-21 19:07



Per ulteriori informazioni sull'esecuzione rapida dei metodi proposti dalla risposta accettata (loop di 10 m):

  • 'key' in mydict tempo trascorso 1.07 sec
  • mydict.get('key') tempo trascorso 1.84 sec
  • mydefaultdict['key'] tempo trascorso 1.07 sec

Quindi usando in o defaultdict sono raccomandati contro get.


35
2018-05-29 11:06



Il dizionario in python ha un metodo get ('chiave', predefinito). Quindi puoi semplicemente impostare un valore predefinito nel caso in cui non ci sia una chiave.

values = {...}
myValue = values.get('Key', None)

18
2018-03-01 09:03



Per il controllo puoi usare has_key() metodo

if dict.has_key('key1'):
   print "it is there"

Se vuoi un valore, puoi usarlo get() metodo

a = dict.get('key1', expeced_type)

Se si desidera una tupla o elenco o dizionario o qualsiasi stringa come valore predefinito come valore di ritorno, quindi utilizzare get() metodo

a = dict.get('key1', {}).get('key2', [])

15
2017-09-10 18:37



Utilizzando l'operatore ternario:

message = "blah" if 'key1' in dict else "booh"
print(message)

14
2017-08-18 22:58