Je me demande ce qu'il y a de mieux à faire:
d = {'a': 1, 'b': 2}
'a' in d
True
ou:
d = {'a': 1, 'b': 2}
d.has_key('a')
True
in
est définitivement plus pythonique.
En fait, has_key()
a été supprimé de Python 3.x .
in
gagne haut la main, non seulement en élégance (et non pas déconseillée ;-), mais aussi en 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
Bien que l'observation suivante ne soit pas toujours true, vous remarquerez que généralement, en Python, la solution la plus rapide est plus élégante et Pythonic; c'est pourquoi -mtimeit
est SO utile - ce n'est pas juste à propos d'économiser une centaine de nanosecondes ici et là! -)
Selon python _ docs :
has_key()
est obsolète en faveur dekey in d
.
Utilisez dict.has_key()
si (et seulement si) votre code doit pouvoir être exécuté par Python versions antérieures à 2.3 (lorsque key in dict
a été introduit).
Il existe un exemple où in
tue réellement votre performance.
Si vous utilisez in
sur un conteneur O(1) qui n'implémente que __getitem__
et has_key()
mais pas __contains__
, vous allez transformer un O(1) recherche dans une recherche O(N) (comme in
revient à une recherche linéaire via __getitem__
).
La correction est évidemment triviale:
def __contains__(self, x):
return self.has_key(x)
has_key
est une méthode de dictionnaire, mais in
fonctionnera sur toutes les collections. Même lorsque __contains__
est manquant, in
utilisera une autre méthode pour itérer la collection afin de le découvrir. .
La solution de dict.has_key () est obsolète, utilisez 'in' - sublime text editor 3
Ici, j'ai pris un exemple de dictionnaire nommé 'ages' -
ages = {}
# Add a couple of names to the dictionary
ages['Sue'] = 23
ages['Peter'] = 19
ages['Andrew'] = 78
ages['Karren'] = 45
# use of 'in' in if condition instead of function_name.has_key(key-name).
if 'Sue' in ages:
print "Sue is in the dictionary. She is", ages['Sue'], "years old"
else:
print "Sue is not in the dictionary"
Développer les tests de performance d'Alex Martelli avec les commentaires d'Adam Parkin ...
$ python3.5 -mtimeit -s'd=dict.fromkeys(range( 99))' 'd.has_key(12)'
Traceback (most recent call last):
File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/timeit.py", line 301, in main
x = t.timeit(number)
File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/timeit.py", line 178, in timeit
timing = self.inner(it, self.timer)
File "<timeit-src>", line 6, in inner
d.has_key(12)
AttributeError: 'dict' object has no attribute 'has_key'
$ python2.7 -mtimeit -s'd=dict.fromkeys(range( 99))' 'd.has_key(12)'
10000000 loops, best of 3: 0.0872 usec per loop
$ python2.7 -mtimeit -s'd=dict.fromkeys(range(1999))' 'd.has_key(12)'
10000000 loops, best of 3: 0.0858 usec per loop
$ python3.5 -mtimeit -s'd=dict.fromkeys(range( 99))' '12 in d'
10000000 loops, best of 3: 0.031 usec per loop
$ python3.5 -mtimeit -s'd=dict.fromkeys(range(1999))' '12 in d'
10000000 loops, best of 3: 0.033 usec per loop
$ python3.5 -mtimeit -s'd=dict.fromkeys(range( 99))' '12 in d.keys()'
10000000 loops, best of 3: 0.115 usec per loop
$ python3.5 -mtimeit -s'd=dict.fromkeys(range(1999))' '12 in d.keys()'
10000000 loops, best of 3: 0.117 usec per loop
Python 2.x prend en charge has_key()
.
Python 2.3+ et Python 3.x prennent en charge in
.
Si vous avez quelque chose comme ça
t.has_key(ew)
changez-le en dessous pour une exécution sur Python 3.X et versions ultérieures
key = ew
if key not in t