MyDict = {'key1':'value1', 'key2':'value2'}
Je peux faire ceci de quelques manières:
if 'key1' in MyDict:
var1 = MyDict['key1']
ou
if MyDict.has_key('key1'):
var1 = MyDict['key1']
ou
if MyDict['key1']: var1=MyDict['key1']
ou
try:
var1=MyDict['key1]
except KeyError, e:
pass
ou j'ai essayé quelque chose comme ça, mais ça ne fonctionne pas comme ça en python
if v=MyDict.get('key1'):
var1=v
Et nous avons probablement trouvé beaucoup plus de façons de le faire. Laquelle est la plus efficace en termes de vitesse de calcul?
Une petite référence pour vous (ipython):
In [1]: def test_1(d, k):
...: if k in d:
...: var1 = d[k]
...:
In [2]: def test_2(d, k):
...: if d.has_key(k):
...: var1 = d[k]
...:
In [3]: def test_3(d, k):
...: try:
...: var1 = d[k]
...: except KeyError as e:
...: pass
...:
In [4]: def test_4(d, k):
...: if d.get(k):
...: var1 = d[k]
...:
In [5]: my_dict = {'key{}'.format(i): 'value{}'.format(i) for i in range(1000)}
In [6]: key_valid = "key5"
In [7]: key_non_valid = "key"
In [8]: %timeit test_1(my_dict, key_valid)
10000000 loops, best of 3: 172 ns per loop
In [9]: %timeit test_1(my_dict, key_non_valid)
10000000 loops, best of 3: 132 ns per loop
In [10]: %timeit test_2(my_dict, key_valid)
1000000 loops, best of 3: 211 ns per loop
In [11]: %timeit test_2(my_dict, key_non_valid)
10000000 loops, best of 3: 171 ns per loop
In [12]: %timeit test_3(my_dict, key_valid)
10000000 loops, best of 3: 151 ns per loop
In [13]: %timeit test_3(my_dict, key_non_valid)
1000000 loops, best of 3: 1.07 µs per loop
In [14]: %timeit test_4(my_dict, key_valid)
1000000 loops, best of 3: 246 ns per loop
In [15]: %timeit test_4(my_dict, key_non_valid)
10000000 loops, best of 3: 189 ns per loop
Conclusion: construction key in dict
est généralement le plus rapide, surclassé uniquement par try except
en cas de clé valide, car elle n'effectue pas l'opération if
.
En supposant que vous dont voulez que var1
Soit défini uniquement si MyDict["key1"]
Est défini, la solution évidente est var1 = MyDict.get("key1", default=some_sentinel_or_default_value)
.
wrt/performances, cela dépend principalement si vous vous attendez à ce que "key1" soit dans votre dict la plupart du temps ou non. Si le premier, un bloc try/except peut être plus rapide, sinon il sera plus lent (les blocs try/except sont peu coûteux à installer mais coûteux quand il y a une exception réelle).
Si vous vous souciez vraiment des performances, je vous suggère de tester les différentes options sur des données réelles en utilisant le module timeit
.
Cette méthode est très rapide:
if 'key1' in MyDict:
var1 = MyDict['key1']
En supposant certaines conditions sur les éléments de votre dictionnaire et le hachage, ceci devrait être en moyenne O [1]