Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 26-09-2009 17:59:06
[Python] combinaisons
Bonjour,
Cette après midi je me suis lancé dans un programme permettant de donner toutes les combinaisons possible avec 2 champs et comme caractères seulement les chiffres (0,1,2,3,4...9) ...j'ai "réussi" à faire le programme et il me donne les 100 combinaisons possible mais, il me met un erreur à la fin de l'exécution et je ne comprend pas pourquoi elle est là...
Pour le code :
f,e,c,b=0,0,0,0
g=10
while e!=g:
a=lst[e],lst[b]
e+=1
c+=1
if c==10:
b+=1
c=0
print a
if e>9:
e=0
Pour l'erreur :
File "C:/Documents and Settings/Compaq_Propriétaire/Bureau/mon site/Programmation/test_combi_01.py", line 8, in <module>
a=lst[e],lst[b]
IndexError: list index out of range
Merci d'avance pour votre aide.
La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.
Hors ligne
#2 26-09-2009 19:45:27
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 989
Re : [Python] combinaisons
Bonsoir,
Ne jamais oublier : tu pars de 0 et non de 1, donc de 0 à 10, cela te fait 11 éléments et non 10.
Dans ton script, si e ne dépasse pas 9, b lui arrive jusqu'à 10 et donc tu essaies d'accéder au 11e de ta liste...
Ce qui foire !
As-tu une raison particulière de procéder ainsi ?
Parce que je te propose :
for i in xrange(10):
for j in xrange(10):
a = i,j
print a
list.append(a)
print list
En prime je conserve la liste de tes tuples (en français, ici couples) dans la liste nommée list.
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#3 03-10-2009 17:41:17
Re : [Python] combinaisons
Salut,
A ok...
Y a vraiment rien à faire, je n'arrive pas à utilisé cette boucle (for) dans les programmes que je fait -_-' et pourtant j'ai lu des docs sur ça simplicité à faire tel ou tel chose mais j'arrive pas à m'en servir...
En tout cas merci beaucoup pour ce code :-)
@+
La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.
Hors ligne
#4 03-10-2009 19:16:24
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 989
Re : [Python] combinaisons
Salut,
Alors une boucle...
Deux exemples :
for a in list:
print a
donne :
A
1
2
toto
1024
Ca, c'est une boucle sur liste que tu as fait toi...
for i in range(10):
S+=2*i+1
print i+1," ",2*i+1,' ',S
Résultat :
1 1 1
2 3 4
3 5 9
4 7 16
5 9 25
6 11 36
7 13 49
8 15 64
9 17 81
10 19 100
La première colonne compte le nombre de tours de la boucle : correspond au nombre i +1. Puisque i+1 va de 1 à 10, c'est que i va de 0 à 9. Donc quand tu demandes range(10) tu fabriques la liste des 10 premiers nombres entiers de 0 à 9, puis tu pioches l'un après l'autre tous les nombres de la liste.
La deuxième colonne affiche les 10 premiers nombres impairs.
La troisième colonne affiche la somme S des (i+1) premiers nombres impairs pour i de 0 9 :
un nombre impair S = 1,
deux nombres impairs S = 1 + 3 = 4
trois nombres impairs S = 1 + 3 + 5 = 9
Maintenant, normalement, si je te dis : trouve-moi la somme des 50 premiers nombres impairs, tu dois pouvoir donner la réponse en 2 s... Non ?
Peut-être as-tu constaté que je n'utilisais plus range mais xrange... Qu'est-ce que ça change ?
Pas grand chose et beaucoup à la fois :
En mode console tu tapes :
et tu obtiens [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], une liste ! la liste des 10 premiers nombres entiers.
et si tu tapes xrange(10) tu obtiens... rien !
xrange ne construit pas de liste, on va dire, pour simplifier que c'est un compteur qui ne fonctionne qu'avec "autre chose".
print i,
te renvoie 0 1 2 3 4 5 6 7 8 9...
Mais il a fabriqué ces nombres à la demande l'un après l'autre... IL n'a pas construit une liste d'abord, puis pioché les nombres dans la liste... Donc xrange pour de très grandes quantités, consomme moins de mémoire, est plus rapide.
Encore un petit raffinement pour les boucles : tu n'es pas obligé de commencer à 0, et tu n'es pas obligé de prendre les nombres l'un après l'autre, tu peux les prendre de 2 en 2, de 3 en 3...
Exemple pour afficher les 10 premiers nombres impairs, je vais commencer à 1, aller de 2 en 2, jusqu'à 19, et dire à la boucle
- que tu commences à 1
- que tu vas jusqu'à 20 (et elle s'arrêtera à 19, donc)
- que tu veux avoir les nombres de 2 en 2.
Voilà ce que ça donne :
print i,
Affichage
1 3 5 7 9 11 13 15 17 19
C'est plus clair ? Fais des essais avec les boucles... C'est comme ça que tu avanceras.
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#5 03-10-2009 23:08:15
Re : [Python] combinaisons
Re,
Ce que tu vient de m'expliquer je l'ai lu à mainte reprise (mis à par le truc sur xrange) mais le problème c'est que j'ai toujours fait avec les boucles while...je pense qu'il va falloir que je fasse se que tu m'a conseillé cet a dire faire différents tests du style les nombres paires, impaires et approfondir...
Merci pour la précision du xrange :-) je l'ignorai totalement...
@+
Dernière modification par Lutcho74 (03-10-2009 23:08:26)
La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.
Hors ligne
#6 04-10-2009 13:58:13
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 989
Re : [Python] combinaisons
'lut,
Je t'ai proposé d'afficher les 10 premiers nombres impairs ainsi :
print i
La même chose avec une boucle while :
while i<20:
print i,
i+=2
--------------------------------------------------------------
Je t'avais aussi donné ce code qui affiche 3 colonnes le nombre de nombres impairs, les nombres impairs, leur somme :
for i in range(10):
S+=2*i+1
print i+1," ",2*i+1,' ',S
La même chose avec while :
while i<10:
S+=2*i+1
print i+1," ",2*i+1,' ',S
i+=1
--------------------------------------------------------------------------------------------------------
Et encore après ton post/question sur ton script de combinaison et le message d'erreur, je t'avais proposé :
for i in xrange(10):
for j in xrange(10):
a = i,j
print a
list.append(a)
print list
La même chose avec while :
while i<10:
while j <10:
a = i,j
print a
list.append(a)
j+=1
j=0
i+=1
print list
Tu es obligé de gérer toi-même les compteurs j = j + 1 et i = i + 1
Et tu ne dois pas non plus oublier de remettre à zéro le compteur j, lorsque tu sors de la boucle...
Est-ce que ça t'éclaire plus cette fois ?
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
Pages : 1