Les Crash-Devs d'un Passionné

Récupérer un élément dans une liste sans erreur

/Catégorie/python

Temps de lecture : 3 minutes

Il est possible de manipuler des listes python avec l'indice dans laquelle la donnée est stockée.

clipboard
Copier le code
1
2
a = ["a", "b", "c", "d"]
a[0] # print a

Cependant lorsque l'indice n'est pas reconnu (chiffre supérieure à la longueur de la liste) python lève une exception

IndexError: list index out of range

On peut effectuer un test conditionnel avant ou encapsuler l'opération par un

try/except
mais ce n'est pas l'idéale.

La solution que je vous propose est de passer par un slice.

Il s'agit d'une opération d'extraction d’éléments de la liste. Il faut placer des nombres avec le caractère deux points comme séparateur :

  • Le premier nombre indique l'indice de départ
  • Le deuxième nombre indique l'indice de fin
  • Le dernier nombre indique le pas de l'incrément
clipboard
Copier le code
1
2
3
4
5
6
7
a = ["a", "b", "c", "d"]
> a[1:2]
['b']
> a[:2]
['a', 'b']
> a[::2]
['a', 'c']

Vous remarquez que la borne de droite est exclue. Si le nombre est omis il équivaut à 0 pour le premier, la fin de la liste pour le 2ème paramètre et 1 pour l’incrément

Quand on manipule un slice nous obtenons toujours une liste même si le résultat est vide

clipboard
Copier le code
1
2
a[9:]
[]

Ainsi les syntaxes ci-dessous sont équivalentes

clipboard
Copier le code
1
2
3
4
> a[2]
'c'
> a[2:3]
['c']

Si vous souhaitez obtenir le 1er élément d'une liste sans avoir d'erreur si cette liste vide, la syntaxe avec un slice est

a[:1]

Comme évoqué la seule différence est le fait que slice retourne une liste et non l’élément. On peut donc faire

(a[2:3] or [None])[0]

De cette façon si

a[2:3]
retourne une valeur, on l'obtiendrait grâce à
[0]
, sinon
[None]
serait prise avec comme valeur de
 [0]
l'élément
None
.

Cette écriture n'est pas facile à lire et à écrire d'ailleurs. Je vous propose de passer par du unpacking. C'est la faculté de déstructurer un itérateur pour par exemple envoyer les éléments d'une liste en tant que paramètre d'une fonction. Ici nous allons l'utiliser pour extraire le seul élément de la liste

>>> str(*a[9:])

''

Cette dernière solution fonctionne uniquement si l'on souhaite extraire un seul élément de la liste car nous réalisons un cast et la fonction str accepte un seul paramètre.

On peut également faire un cast en int en fonction du contenu de votre liste d'origine

a

Voilà une solution pour récupérer la valeur dans une liste même si l'index n'existe pas.