List Comprehensions avec Python

Python fournit une façon intéressante de réarranger une liste, ou élément itérable comme une chaîne de caractères par exemple. L’idée est de pouvoir écrire des conditions (if) directement dans une liste pour la construire. Simplifiant ainsi le code en le rendant plus lisible.

Prenons un exemple simple. Partant d’une liste de nombres, je veux créer une nouvelle liste ne contenant que des chiffres pairs.

Une résolution rapide pourrait être par exemple :

>>> numbers = [2, 5, 8, 13, 42, 69]
>>> result = []
>>> for n in numbers:
...     if n % 2 is 0:
...         result.append(n)
...
>>> print result
[2, 8, 42]

La solution utilisant les list comprehensions serait pour un même résultat :

>>> numbers = [2, 5, 8, 13, 42, 69]
>>> [n for n in numbers if n % 2 is 0]
[2, 8, 42]

Si le principe peut dérouter un peu à première vue, on sent rapidement que sont usage peut être très vaste et fréquent. Dans l’exemple, on discerne trois parties, avant le for, entre le for et le if, et après le if. Le if n’est pas obligatoire, et dans l’exemple, la première partie (avant le for) est simplifié au maximum. On pourrait par exemple multiplier n par deux :

>>> numbers = [2, 5, 8, 13, 42, 69]
>>> [2*n for n in numbers if n % 2 == 0]
[4, 16, 84]

En prenant l’exemple tiré de la documentation:

>>> freshfruit = ['  banana', '  loganberry ', 'passion fruit  ']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']

Prenons un autre exemple. Imaginons que partant d’un mot, on souhaite trouver l’index de toute les occurrences d’une lettre.

>>> word = 'anticonstitutionnellement'
>>> [index for (index, letter) in enumerate(word) if letter is 't']
[2, 8, 10, 12, 24]

Le schéma est toujours le même, ce n’est qu’une variante avec un enumerate au lieu de in.

Concernant les if, ils ne sont pas limités, permettant d’affiner les besoins.

Billet court, sur une méthode puissante de Python, dont les exemples auraient pu s’étendre, mais suivent le même principe de base. Pour ma part, je privilégierais dorénavant cette façon de procéder pour construire une liste. Et en y repensant, j’aurais pu bien souvent avoir recours aux List Comprehensions. La documentation officielle sur cette façon de procédé est courte mais claire.

Vus : 1146
Publié par Nicolas Paris : 149