PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

Benoît Boudaud : Python: La compréhension de liste

lundi 27 février 2017 à 06:51

Pour une lecture plus agréable (page plus large), je vous suggère de cliquer sur ce lien et ainsi de lire cet article dans la rubrique consacrée au langage Python.

La compréhension de liste est une expression qui permet de construire une liste à partir de tout autre type itérable (liste, tuple, chaîne de caractères…). Le résultat obtenu est toujours une liste.

python

1) Une compréhension de liste toute simple

Un exemple valant mieux qu’un long discours, nous allons créer une liste de nombres entiers :

liste_initiale = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

À l’aide d’une boucle for et de la méthode append(), nous allons ajouter à une nouvelle liste baptisée liste_2, chaque élément de liste_initiale multiplié par deux.

liste_initiale = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
liste_2 = []
for n in liste_initiale:
    liste_2.append(n*2)
print(liste_2)

Résultat : liste_2 = [0, 2, 4, 6, 8, 10 ,12, 14, 16, 18, 20, 22, 24, 26, 28, 30]

J’ai donc utilisé une boucle for pour écrire ce petit bout de code de cinq lignes. Mais j’aurais tout aussi bien pu utiliser une compréhension de liste pour obtenir le même résultat. Voici la syntaxe de cette dernière :

liste_initiale = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
liste_2 = [n*2 for n in liste_initiale]
print(liste_2)

Résultat : liste_2 = [0, 2, 4, 6, 8, 10 ,12, 14, 16, 18, 20, 22, 24, 26, 28, 30]

Que remarque-t-on? Le code est plus concis puisqu’il tient sur trois lignes au lieu de cinq. Vous allez me dire que la différence est minime et dans cet exemple tout simple, je dois reconnaître que vous avez raison! Mais attendez de voir la suite…

2) Une compréhension de liste avec une condition

Je souhaite  créer une nouvelle liste de nombres pairs multipliés par 2 à partir de liste_initiale qui contient, je vous le rappelle des nombres pairs et impairs. Il va donc falloir que j’introduise une condition pour ignorer les nombres impairs. Comparons une nouvelle fois le code écrit avec une boucle for et celui écrit avec une compréhension de liste.

Avec une boucle for

liste_initiale = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
liste_pair = []
for n in liste_initiale:
    if n % 2 == 0:
        liste_pair.append(n*2)
print(liste_pair)

Résultat : liste_pair = [0, 4, 8,  12, 16, 20, 24, 28]

Avec une compréhension de liste

J’introduis la condition à la fin de la compréhension de liste. Au lieu d’avoir six lignes de code, je n’en ai plus que trois.

liste_initiale = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
liste_pair = [n*2 for n in liste_initiale if n % 2 == 0]
print(liste_pair)

Résultat : liste_pair = [0, 4, 8,  12, 16, 20, 24, 28]

3) Une compréhension de liste avec une expression conditionnelle

Encore plus fort, je souhaite créer une nouvelle liste avec les éléments de liste_initiale. Les chiffres pairs seront multipliés par deux, les chiffres impairs par trois. Il va donc falloir que j’introduise une condition if… else.

Avec une boucle for

liste_initiale = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
nouvelle_liste = []
for n in liste_initiale:
    if n % 2 == 0:
        nouvelle_liste.append(n*2)
    else:
        nouvelle_liste.append(n*3)
print(nouvelle_liste)

Résultat : nouvelle_liste = [0, 3, 4, 9, 8, 15, 12, 21, 16, 27, 20, 33, 24, 39, 28, 45]

Avec une compréhension de liste

Ça se complique un peu car il faut utiliser une expression conditionnelle qui évalue si la condition est vraie (True) ou fausse (False). Mais le résultat est au rendez-vous puisqu’au lieu d’avoir huit lignes de code, je n’en ai que trois!

liste_initiale = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
nouvelle_liste = [n*2 if n % 2 == 0 else n*3 for n in liste_initiale]
print(nouvelle_liste)

 4) Une compréhension de liste avec une liste de listes

Il est possible de faire une compréhension de liste avec une liste de listes. Pour s’y retrouver dans l’imbrication des instructions, le plus simple est de comparer la syntaxe d’une boucle for avec celle d’une compréhension de liste.

Avec une boucle for

liste_initiale = [[0, 'a'], [2, 'b'], [3, 'c']]
nouvelle_liste = []
for i in liste_initiale :
    for n in i :
        nouvelle_liste.append(n*2)
print(nouvelle_liste)

Résultat: nouvelle_liste = [0, ‘aa’, 4, ‘bb’, 6, ‘cc’]

Avec une compréhension de liste

liste_initiale = [[0, 'a'], [2, 'b'], [3, 'c']]
nouvelle_liste = [n*2 for i in liste_initiale for n in i]
print(nouvelle_liste)

Résultat: nouvelle_liste = [0, ‘aa’, 4, ‘bb’, 6, ‘cc’]

Avec une expression conditionnelle

Par exemple, je veux multiplier les nombres entiers par deux et les strings par trois.

liste_initiale = [[0, 'a'], [2, 'b'], [3, 'c']]
nouvelle_liste = [n*2 if type(n) == int else n*3 for i in liste_initiale for n in i]
print(nouvelle_liste)

Résultat: [0, ‘aaa’, 4, ‘bbb’, 6, ‘ccc’]

Dans ce dernier exemple, si j’avais fait usage d’une boucle for, j’aurais écrit neuf lignes de code au lieu de trois!

liste_initiale = [[0, 'a'], [2, 'b'], [3, 'c']]
nouvelle_liste = []
for i in liste_initiale:
    for n in i:
        if type(n) == int:
            nouvelle_liste.append(n*2)
        else:
            nouvelle_liste.append(n*3)
print(nouvelle_liste)

Cela dit, ce n’est pas non plus le concours de celui qui écrira le plus d’instructions sur la même ligne de code. Il faut que ça reste déchiffrable.

5) Les compréhensions de liste avec les autres types itérables

Comme je le disais en introduction, les compréhensions de liste fonctionnent avec les autres types itérables mais le résultat obtenu est toujours une liste. Par exemple, avec une chaîne de caractères :

prenom = "Gustave"
liste_lettres = [lettre for lettre in prenom]
print(liste_lettres)

Résultat: [‘G’, ‘u’, ‘s’, ‘t’, ‘a’, ‘v’, ‘e’]

Conclusion

La compréhension de liste est une méthode puissante qui a remplacé les anciennes fonctions map() et filter() dont l’usage est aujourd’hui déconseillé. Bien utilisée, la compréhension de liste rend le code plus concis, plus élégant et plus facile à comprendre qu’avec les fonctions map() et filter(). Voici la page consacrée aux compréhensions de liste dans la documentation officielle du langage Python.

Il existe également une compréhension de dictionnaire et d’ensemble que nous aborderons dans le chapitre consacré à ces deux structures de données.


Gravatar de Benoît Boudaud
Original post of Benoît Boudaud.Votez pour ce billet sur Planet Libre.

Articles similaires

Journal du hacker : Liens intéressants Journal du hacker semaine #08

lundi 27 février 2017 à 00:01

Pour la 8ème semaine de 2017, voici 10 liens intéressants que vous avez peut-être ratés, relayés par le Journal du hacker, votre source d’informations pour le Logiciel Libre francophone !

Pour ne plus rater aucun article de la communauté francophone, voici :

De plus le site web du Journal du hacker est « adaptatif (responsive) ». N’hésitez pas à le consulter depuis votre smartphone ou votre tablette !

Le Journal du hacker fonctionne de manière collaborative, grâce à la participation de ses membres. Rejoignez-nous pour proposer vos contenus à partager avec la communauté du Logiciel Libre francophone et faire connaître vos projets !

Et vous ? Qu’avez-vous pensé de ces articles ? N’hésitez pas à réagir directement dans les commentaires de l’article sur le Journal du hacker ou bien dans les commentaires de ce billet :)

Gravatar de Journal du hacker
Original post of Journal du hacker.Votez pour ce billet sur Planet Libre.

Thuban : Domaine renouvelé

dimanche 26 février 2017 à 10:38

Petite brève rapide pour annoncer le renouvellement d'obsd4a.net.

Je verrai dans un an si le domaine est un peu utile.

À bientôt pour de nouvelles aventures.

Gravatar de Thuban
Original post of Thuban.Votez pour ce billet sur Planet Libre.

Bridouz : Yunohost 2.5 tourne bien, merci

dimanche 26 février 2017 à 01:00

Vers la mi-janvier le projet YunoHost sorti sa version 2.5 sobrement appelé Chelsea Manning. L’envie m’a pris de vouloir installer tout ce petit monde sur mon Raspberry.

Une image pour les raspberry est de nouveau disponible pour YunoHost et elle s’installe en un clin d’œil sans rien faire. Je l’ai même testé en SSH sans passer par un écran pour la post- installation, impeccable. Il faudra cependant penser à éditer le fichier wpa_supplicant.conf pour ajouter votre SSID wifi à la main si vous ne passez pas par une connexion Ethernet. Ensuite un simple yunohost tools post-install vous permettra de finir la configuration de votre instance tranquillement.

Là où il y a quelques mois j’avais pas mal galéré pour installer Raspbian, ajouter YunoHost, résoudre les dépendances, les problèmes de création de compte, aujourd’hui tout s’est passé sans accros, simplement.

Premier point positif de cette nouvelle version la présence par défaut du générateur de certificat ssl letsencrypt (certbot) nativement. Génération d’une clé DH en sus et voilà yunohost avec un beau A+ chez SSLabs. C’était un des principaux manques pour que YunoHost devienne encore plus agréable et facile à utiliser. Un outil Diagnostic permet également d’obtenir de précieuses informations rapidement. Je note aussi que les différents logs de service comme nginx, fail2ban et ssh sont accessibles depuis l’interface web. J’ai sûrement dû louper cette fonctionnalité avant, c’est vraiment une chouette idée.

L’installation des logiciels officiels et depuis le github Yunohost-apps se sont toutes bien passées. Le tout est correctement configuré et démarre directement depuis l’interface utilisateur. Un grand bravo à toutes les personnes qui travaillent pour que ce système intuitif soit de cette qualité.

Le seul souci que j’ai rencontré se trouve dans la synchronisation de nextcloud avec Android en wifi. Impossible de se connecter au serveur, en revanche en utilisant le réseau mobile aucun soucis. Pour contourner le problème je suis passer par la création d’une application mobile avec mot de passe. Ainsi mon appareil Android n’a plus de soucis de synchronisation que ce soit avec l’application officielle, davdroid ou encore notes et ocreader.

Le projet continue son chemin et devient réellement intéressant selon moi pour un auto hébergent intuitif et agréable, bravo à l’équipe. Sur un raspberry ça s’installe simplement, ça tourne du tonnerre (Nextcloud, Gogs et Wallabag pour le moment), l’administration est facile à prendre en main. Un régal.

Gravatar de Bridouz
Original post of Bridouz.Votez pour ce billet sur Planet Libre.

Yannic Arnoux : Termux pour quoi faire ?

vendredi 24 février 2017 à 13:00

Cascador m'a communiqué son engouement pour Termux à travers sa série d'articles Termux sur Android. En quelques mots, Termux est un terminal pour Android qui émule un environnement Debian et permet d'installer certains programmes à travers le gestionnaire de paquets apt. Point intéressant, cela fonctionne sans avoir rooté son appareil Android et le projet est plutôt actif avec des mises à jour de paquets régulières. La série de Cascador décrit différents scénarios d'utilisation : installer un serveur SSH, utiliser des outils console, accéder à des API Android.

termuxJ'ai bien mordu, jusqu'à me faire offrir un super clavier bluetooth pour Noël (merci frérot).

Le risque était que le coup de coeur retombe ; qu'après avoir bien rigolé à installer vim et consorts, on s'essoufle à cause des limitations techniques (on n'a pas un vrai Linux, le matériel a des performances limitées) ou du manque d'utilité. Et bien, après 3 mois d'utilisation, je peux témoigner que ce n'est pas mon cas. J'ai deux cas d'usages récurrents (en plus de faire le malin) sur ma tablette.

Premier usage : j'ai un Linux dans la poche (enfin dans le sac à dos) qui me permet d'accéder à mes serveurs hébergés. Termux va plus loin qu'un simple client SSH car je peux rapatrier et transférer des fichiers, j'ai des outils de base de Linux (curl, wget). La tablette est Wifi et je peux monter un Hotspot Wifi avec mon téléphone donc je peux faire le pompier de n'importe où.

Seconde utilisation : j'ai installé tout ce qu'il faut pour écrire mes articles de blog. C'était un peu prédestiné à vrai dire : ayant un blog statique dans lequel j'écris mes articles en Markdown, j'ai besoin d'outils console uniquement : vim pour écrire et python pour générer le blog en HTML. Du coup en local je peux écrire et vérifier ma production. Et avec une connexion Internet, je publie l'article grâce à git.

Termux est une application publiée sur le Play Store et sur F-Droid, sous licence GPL, qui vaut le coup d'être testée. Et en fonction de vos besoin, vous pourriez bien y trouver un intérêt sur le long terme.

Gravatar de Yannic Arnoux
Original post of Yannic Arnoux.Votez pour ce billet sur Planet Libre.

Articles similaires