380 votes

Pourquoi la liste n'a pas de méthode "get" comme un dictionnaire?

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

156voto

Nick Bastin Points 12627

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.

118voto

Jake Points 2460

Cela fonctionne si vous voulez le premier élément, comme my_list.get(0)

 >>> my_list = [1,2,3]
>>> next(iter(my_list), 'fail')
1
>>> my_list = []
>>> next(iter(my_list), 'fail')
'fail'
 

Je sais que ce n'est pas exactement ce que vous avez demandé, mais que cela pourrait aider les autres.

69voto

Keith Points 13800

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

48voto

YOU Points 44812

Au lieu d'utiliser .get, utiliser comme ceci devrait être correct pour les listes. Juste une différence d'utilisation.

 >>> l = [1]
>>> l[10] if 10 < len(l) else 'fail'
'fail'
 

20voto

qwer0rewq Points 11

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

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