1104 votes

'has_key()' ou 'dans'?

Je me demande ce qui est le mieux à faire:

d = {'a': 1, 'b': 2}
'a' in d
True

ou:

d = {'a': 1, 'b': 2}
d.has_key('a')
True

1598voto

tonfa Points 8867

in est nettement plus pythonic.

En fait, has_key() a été supprimé en Python 3.x.

273voto

Alex Martelli Points 330805

in gagne haut la main, et pas seulement dans l'élégance (et de ne pas être obsolète;-) mais aussi dans la performance, par exemple:

$ python -mtimeit -s'd=dict.fromkeys(range(99))' '12 in d'
10000000 loops, best of 3: 0.0983 usec per loop
$ python -mtimeit -s'd=dict.fromkeys(range(99))' 'd.has_key(12)'
1000000 loops, best of 3: 0.21 usec per loop

Alors que la suite de l'observation n'est pas toujours vrai, vous remarquerez que d'habitude, en Python, le plus rapide de la solution est plus élégante et Pythonic; c'est pourquoi, -mtimeit est DONC utile, et pas seulement à propos de l'enregistrement d'une centaine de nanosecondes ici et là!-)

115voto

Nadia Alramli Points 40381

Selon python docs:

has_key() est dépréciée en faveur de key in d.

46voto

John Machin Points 39706

Utiliser dict.has_key() si (et seulement si) votre code est nécessaire pour être praticable par les versions de Python antérieures à 2.3 (lorsqu' key in dict a été introduit).

27voto

schlenk Points 3480

Il y a un exemple où l' in fait tue votre performance.

Si vous utilisez in sur un O(1) conteneur qui n'implémente __getitem__ et has_key() mais pas __contains__ vous tournez un O(1) recherche en O(N) de recherche ( in revient à une recherche linéaire via __getitem__).

Correctif est évidemment trivial:

def __contains__(self, x):
    return self.has_key(x)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X