Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 16-02-2021 08:01:03

CarFunam
Membre
Inscription : 07-12-2020
Messages : 7

Boucles "for" compactes sur une seule ligne (PYTHON)

Bonjour,

J'ai rencontré parfois des boucles "for" décrites sur une seule ligne de code qui ressemble un peu à cela :  ...L[x] for x in range(10)....

Hélas je ne trouve nulle part de règles d'écriture de cette syntaxe. Pourriez-vous me conseiller ?

De plus, comment effectuer le même genre d'écriture compacte sur 1 seule lige avec un tableau à 2 dimensions ?
....L[x][y] forx in range(5), for y in range(10)....

Pour ce second point, j'aurais besoin de créer avec une seule ligne de code, une liste contenant bout à bout tous les éléments du tableau L[x][y] en les mettant bout à bout , ligne par ligne

Avec mes remerciements par avance à vous.

Cdlt

Hors ligne

#2 16-02-2021 10:17:49

Chlore au quinoa
Membre
Inscription : 06-01-2021
Messages : 305

Re : Boucles "for" compactes sur une seule ligne (PYTHON)

Salut !

Pour ton premier point tu parles bien de la création de liste (ou autre ?) à partir d'une boucle for ? Si oui une synthaxe de ce style fonctionne :

L=[i**2 for i in range (0,12)]

Adam


"En mathématiques, on ne comprend pas les choses. On s'y habitue."

J. von Neumann

Hors ligne

#3 16-02-2021 10:55:45

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : Boucles "for" compactes sur une seule ligne (PYTHON)

RE,

Il fallait chercher : définition de liste en compréhension

Exemples :
P=[2*i for i in range (20)] c'est la liste des 20 premiers nombres pairs...

D=[[i,j] for i in range(1,8,2) for j in range(1,10,3)]
C'est la liste des liste [i,j] obtenues, lorsque i parcourant les nombres de 1  à 7 par pas de 2, j parcourt les nombres de 1 à 9 par pas de 3 :
[[1, 1], [1, 4], [1, 7], [3, 1], [3, 4], [3, 7], [5, 1], [5, 4], [5, 7], [7, 1], [7, 4], [7, 7]]

On peut raffiner :
D=[[i,j] for i in range(1,8,2) for j in range(1,10,3) if (i+j)%2==0] :
[[1, 1], [1, 7], [3, 1], [3, 7], [5, 1], [5, 7], [7, 1], [7, 7]]

Ça, ce n'est pas clair :

Pour ce second point, j'aurais besoin de créer avec une seule ligne de code, une liste contenant bout à bout tous les éléments du tableau L[x][y] en les mettant bout à bout , ligne par ligne

On va voir si j'ai compris .
Soit une liste de listes :
T=[[5*(i-1)+j for j in range(1,6)] for i in range(1,6)]
qui donne
T=[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25]]
représentant un le carré des 25 entiers de 1 à 5.
Affichage du carré:

for element in T:
    for nb in element:
        print ("%2i" % nb, end=" ")
    print()


 1  2  3  4  5
 6  7  8  9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

Et tu veux avoir la liste de ces 25 éléments mis bout à bout dans une liste simple, via une list comprehension (en anglais dans le texte) :
B=[nb for element in T for nb in element]
qui donne :
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]

C'est cela que tu cherchais ?


[EDIT]Ave Chlore au quinoa !

Dernière modification par yoshi (16-02-2021 11:08:32)


Arx Tarpeia Capitoli proxima...

Hors ligne

#4 16-02-2021 12:34:41

CarFunam
Membre
Inscription : 07-12-2020
Messages : 7

Re : Boucles "for" compactes sur une seule ligne (PYTHON)

Tout d'abord, merci beaucoup pour vos réponses.
"Listes en compréhension" : voilà le bon et vrai vocabulaire ! Merci

Pour le point n°1 c'est nickel.
Pour le point n°2 je voudrais obtenir [11,12,13,21,22,23] est-ce que [10*i+j for in in range(1,3) for j in range(1,4) ] est correct ?

Hors ligne

#5 16-02-2021 12:58:47

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : Boucles "for" compactes sur une seule ligne (PYTHON)

Salut,

Pour le savoir, tu fais comme moi, en mode console (moi via IDLE de Python), tu tapes :
>>> [10*i+j for i in range(1,3) for j in range(1,4) ] puis Entrée et tu vois apparaître :
[11, 12, 13, 21, 22, 23]
>>>
Réponse : oui

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#6 16-02-2021 13:00:18

Chlore au quinoa
Membre
Inscription : 06-01-2021
Messages : 305

Re : Boucles "for" compactes sur une seule ligne (PYTHON)

Ave yoshi,
Re CarFunam,


"Liste en compréhension" yes effectivement merci yoshi le terme m'échappait.

Pour te répondre @CarFunam...Pas vraiment. Ta commande va faire parcourir à i les valeurs 1 et 2, et à j les valeurs 1,2,3. Tu obtiendras donc [12,13,14,13,14,15] aux erreurs de calcul près.

Si tu veux ceci :[11,12,13,21,22,23], je dirais quelque chose comme

L=[i+j for i in range(10,29,10) for j in range (1,4)]

Adam

Dernière modification par Chlore au quinoa (16-02-2021 13:01:10)


"En mathématiques, on ne comprend pas les choses. On s'y habitue."

J. von Neumann

Hors ligne

#7 16-02-2021 14:09:48

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : Boucles "for" compactes sur une seule ligne (PYTHON)

Re,

@Chlore au quinoa :
Python :
>>> [10*i+j for i in range(1,3) for j in range(1,4) ]==[i+j for i in range(10,29,10) for j in range (1,4)]
True

C'est vrai aussi, mais la solution d'origine marche !

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#8 16-02-2021 14:42:18

Chlore au quinoa
Membre
Inscription : 06-01-2021
Messages : 305

Re : Boucles "for" compactes sur une seule ligne (PYTHON)

AU TEMPS POUR MOI !!! j'avais lu "plus" au lieu de "étoile" dans le code de notre ami je suis un bouffon fini. Du repos s'impose....

Adam


"En mathématiques, on ne comprend pas les choses. On s'y habitue."

J. von Neumann

Hors ligne

#9 16-02-2021 15:33:56

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : Boucles "for" compactes sur une seule ligne (PYTHON)

Bah, l'erreur est humaine et fréquente en programmation... même (surtout ?  vigilance relâchée) dans les formules les plus anodines...


Arx Tarpeia Capitoli proxima...

Hors ligne

Pied de page des forums