Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
Discussion fermé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 :
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 948
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...
En 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 948
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...
En 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
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 948
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...
En 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 948
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...
En ligne
Pages : 1
Discussion fermée