Vraag Controleer of een bepaalde sleutel al bestaat in een woordenboek


Ik wilde testen of een sleutel in een woordenboek bestaat voordat de waarde voor de sleutel wordt bijgewerkt. Ik schreef de volgende code:

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

Ik denk dat dit niet de beste manier is om deze taak te volbrengen. Is er een betere manier om te testen op een sleutel in het woordenboek?


2178
2017-10-21 19:05


oorsprong


antwoorden:


in is de bedoelde manier om te testen op het bestaan ​​van een sleutel in een dict.

d = dict()

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

Als u een standaard wilt, kunt u altijd gebruiken dict.get():

d = dict()

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

... en als u altijd een standaardwaarde wilt hebben voor elke sleutel die u kunt gebruiken defaultdict van de collections module, zoals zo:

from collections import defaultdict

d = defaultdict(lambda: 0)

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

... maar over het algemeen is de in zoekwoord is de beste manier om het te doen.


2232
2017-10-21 19:10



U hoeft geen sleutels te bellen:

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

Dat zal veel zijn sneller omdat het de hashing van het woordenboek gebruikt in tegenstelling tot het doen van een lineaire zoekopdracht, welke oproeptoetsen dat zouden doen.


1093
2017-10-21 19:06



U kunt de aanwezigheid van een sleutel in een woordenboek testen met behulp van de in trefwoord:

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

Een algemeen gebruik om het bestaan ​​van een sleutel in een woordenboek te controleren voordat deze wordt gemuteerd, is om de waarde standaard te initialiseren (bijvoorbeeld als uw waarden lijsten zijn, en u wilt ervoor zorgen dat er een lege lijst is waaraan u kunt toevoegen bij het invoegen van de eerste waarde voor een sleutel). In dergelijke gevallen kunt u de collections.defaultdict() type van belang zijn.

In oudere code kunt u ook enkele toepassingen vinden van has_key(), een verouderde methode om het bestaan ​​van sleutels in woordenboeken te controleren (gebruik gewoon key_name in dict_name, in plaats daarvan).


226
2017-10-21 19:16



Je kunt dit verkorten:

if 'key1' in dict:
    ...

Dit is echter op zijn best een cosmetische verbetering. Waarom denk je dat dit niet de beste manier is?


74
2017-10-21 19:06



Ik zou het gebruik van de setdefault methode in plaats daarvan. Het klinkt alsof het alles zal doen wat je wilt.

>>> 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



Voor aanvullende informatie over snelheidsuitvoering van de voorgestelde methoden van het geaccepteerde antwoord (10m loops):

  • 'key' in mydict verstreken tijd 1,07 sec
  • mydict.get('key') verstreken tijd 1.84 sec
  • mydefaultdict['key'] verstreken tijd 1,07 sec

Daarom gebruiken in of defaultdict worden aanbevolen tegen get.


35
2018-05-29 11:06



Woordenboek in python heeft een get ('sleutel', standaard) methode. U kunt dus gewoon een standaardwaarde instellen voor het geval er geen sleutel is.

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

19
2018-03-01 09:03