Dans ce prog. tout bète

Résolu
Fleben -  
mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   -

Bonjour,

Dans ce programme

A = [1]
for i in range(1, 11):
    A[i] =(A[i - 1] + 1) * 2
    A.append(A[i])
print(A)    

Spyder(python 3.11) me renvoie :

list assignment index out of range

et il m'oblige à faire range(0,11) ce qui remplace dans le tableau A la valeur initiale (1) par la première valeur calculée.

Pourquoi refuse-t-il de démarrer le range avec i = 1 ?

Merci


Windows / Edge 115.0.1901.203

A voir également:

3 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 

Bonjour,

Tu souhaites probablement écrire ceci :

A = [1]
for i in range (1, 11):
   A.append((A[i - 1] + 1) * 2) 
print(A)
1
Fleben
 

Merci pour cette réponse. Effectivement ça fonctionne avec range(1,11).

mais je ne comprends pas pourquoi ça ne fonctionne pas si je calcule A[i] d'abord puis l'ajoute dans le tableau A.

0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 

Le append ajoute un élément au tableau. 

Avant le append, A[i] n'est pas dans le tableau, et tu ne peux donc pas faire appel à A[i] sans dépasser la taille du tableau.

"list assignment index out of range" t'indique que i est hors des dimensions du tableau.

0
mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   7 878 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 

Bonjour,

Je me permets à toute fins utiles de préciser les différentes réponses qui ont déjà été données.

Si on reprend le code initial, au premier tour de boucle, lorsqu'on remplace i par sa valeur (i=1) on obtient :

A[1] = (A[0] + 1) * 2

A[0] est bien défini (donc le membre droit de l'affectation est bien défini), mais pas A[1], car à ce stade, le tableau A ne contient qu'un élément (l'élément A[0], initialisé à 1 par la première ligne du programme). A[1] n'est donc pas défini, d'où l'erreur.

C'est pourquoi la méthode append est ici indiquée : elle concatène à la suite d'un tableau un nouvel élément. Tu peux donc écrire :

A = [1]
for i in range(1, 11):
    a_i =(A[i - 1] + 1) * 2
    A.append(a_i) # Après cette instruction A[i] est bien défini, avant non
print(A)

Une autre stratégie, si tu connais par avance la taille finale de A, serait de créer une liste de la bonne taille (donc dans le cas présent, de taille 11), quitte à la remplir avec des valeurs par défaut (typiquement None en python), comme le propose Jee Pee (#3), mais ça complexifie le code.

A = [None] * 11
A[0] = 1
for i in range (1, 11):
    A[i] =(A[i - 1] + 1) * 2  
print(A)

Bonne chance

0
jee pee Messages postés 41513 Date d'inscription   Statut Modérateur Dernière intervention   9 716
 

Bonjour,

A = [1]                 # Crée une une liste avec la valeur 1 en position 0
for i in range (1, 11):
    A[i] =(A[i - 1] + 1) * 2  # Tu ne peux pas modifier A indice 1 qui n'existe pas
    A.append(A[i])
print(A)

Ajouter un élément à la liste se fait par .append(). Si tu veux modifier la liste, il faudrait au départ la créer avec des valeurs à zéro par exemple. Dans ce cas plus besoin de .append().

A = [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# ou
A = [0] * 11
A[0] = 1
for i in range (1, 11):
    A[i] =(A[i - 1] + 1) * 2  
print(A)

Tu peux aussi passer par une variable intermédiaire, mais c'est une étape inutile

A = [1]
for i in range (1, 11):
    V =(A[i - 1] + 1) * 2
    A.append(V) 
print(A)

0