Magazine

python et les list comprehension

Publié le 29 avril 2008 par Mikebrant

J'ai souvent entendu parler des list comprehensions, mais je m'y suis jamais mis, faut dire qu'à première vue c'est pas très compréhensible....
Ne vous inquiétez pas, grâce à moi vous allez tout comprendre (ou presque).

En réalité, si on se donne la peine de réfléchir quelques secondes(du coup ce billet n'est plus destiné aux femmes) c'est assez élémentaire.
Mais qu'est-ce que c'est ?

Les list comprehensions permettent de générer des listes à partir de séquences auxquelles on applique une expression.

C'est relativement puissant et rend le code plus compact(mais peut-être moins compréhensible pour certains comme par exemple...les codeurs Java).

Rien de tel qu'un petit exemple:

#-*-coding:Utf-8 -*-

maListe=["un","deux","trois","quatre"]
maListeEvoluee=[element.upper() for element in maListe if 'u' not in element]
print (maListeEvoluee)

Dans cet exemple,

maListeEvoluee va être composée uniquement d'éléments présents dans maListe si et seulement s'ils ne contiennent pas de 'u'.

Enfin,chaque élément présent dans maListeEvoluee sera en majuscule.


J'ai appris récemment qu'on pouvait utiliser une expression conditionnelle, du type:

maVariable=monExpression if maCondition else monExpression2

maVariable va donc prendre la valeur de monExpression si et seulement si maCondition est vraie sinon elle prendra la valeur de monExpression2.

Du coup on peut l'utiliser dans les list comprehions,attention si vous êtes blond(e),zappez la suite.


L'exemple:

# -*- coding:Utf-8 -*-

maListe=["un","deux","trois","quatre","cinq","dix sept"]
maListeEvoluee=[( element if ' 'not in element and len(element)>4 else 'erreur') for element in maListe]
maListeEvoluee.sort()
print (maListeEvoluee)


Ici,

maListeEvoluee va se voir affecter chaque élément présent dans maListe.

Si un élément ne contient pas d'espaces et contient au moins 4 caractères alors il sera retourné tel quel,sinon il prendra la valeur 'erreur'.

Enfin on trie maListeEvoluee par ordre alphabétique.

Voici un petit exemple avec les dictionnaires,

parce que j'aime bien les rousses (whao le jeu de mots),
parce que l'on va voir que l'on peut retourner d'autres séquences que des chaines dans notre liste et ,
parce que je trouve que c'est un peu plus compliqué .

# -*- coding:Utf-8 -*-
monDico={"parti":"socialiste","mike":"brant","roch":"voisine","fatal":"bazooka"}
maListeEvoluee=[({"Nom:%s"%(valeur):"Prénom: %s"%(cle)} if len(cle)!=5 else "Inutile") for cle,valeur in monDico.items() ]
maListeEvoluee.sort()
print (maListeEvoluee)


Dans cet exemple,

la méthode items() retourne une liste de tuples composés d'une clé et de sa valeur associée.

La variable cle prendra donc le 1er élément du tuple, c'est à dire la clé, et valeur contiendra donc la valeur associée.
maListeEvoluee contiendra donc un dictionnaire du type"{Nom:Prénom}" si et seulement si cle ne contient pas 5 caractères sinon,la chaine renvoyée sera 'Inutile'.

Enfin on trie à nouveau par ordre alphabétique maListeEvoluee.

Voilà, ce billet est terminé, j'espère que vous n'avez rien compris.
Si des questions subsistent ,n'hésitez pas.


Retour à La Une de Logo Paperblog

A propos de l’auteur


Mikebrant 9 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte