>>> d = {'a':'b'}
>>> d['a']
'b'
>>> d['c']
KeyError: 'c'
>>> d.get('c', 'fail')
'fail'
>>> l = [1]
>>> l[10]
IndexError: list index out of range
Réponses
Trop de publicités?En fin de compte il n'a sans doute pas d'un coffre-fort .get
méthode car un dict
est associatif collection (les valeurs sont associées à des noms) où il est inefficace pour vérifier si une clé est présente (et renvoie sa valeur), sans jeter une exception, alors que c'est super banal pour éviter les exceptions accéder à la liste des éléments (comme l' len
méthode est très rapide). L' .get
méthode permet de demander la valeur associée à un nom, et non pas directement accès à la 37e session de l'élément dans le dictionnaire (ce qui serait plus comme ce que vous demandez de votre liste).
Bien sûr, vous pouvez facilement mettre en œuvre vous-même:
def safe_list_get (l, idx, default):
try:
return l[idx]
except IndexError:
return default
Vous pourriez même monkeypatch sur l' __builtins__.list
constructeur en __main__
, mais qui serait moins le changement généralisé depuis plus de code n'utilise pas. Si tu voulais juste pour l'utiliser avec des listes créées par votre propre code, vous pourriez tout simplement sous-classe list
et ajouter l' get
méthode.
Probablement parce que cela n'avait pas beaucoup de sens pour la sémantique de liste. Cependant, vous pouvez facilement créer le vôtre en sous-classant.
class safelist(list):
def get(self, index, default=None):
try:
return self.__getitem__(index)
except IndexError:
return default
def _test():
l = safelist(range(10))
print l.get(20, "oops")
if __name__ == "__main__":
_test()
La meilleure chose à faire est de convertir la liste en dict, puis d’y accéder avec la méthode get:
>>> my_list = ['a', 'b', 'c', 'd', 'e']
>>> my_dict = dict(zip(range(len(my_list)), my_list))
>>> print my_dict
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e'}
>>> my_dict.get(2)
'c'
>>> my_dict.get(10, 'N/A')