Dans ce prog. tout bète

Résolu/Fermé
Fleben - Modifié le 25 août 2023 à 16:00
mamiemando Messages postés 33274 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 septembre 2024 - 25 août 2023 à 16:11

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 23203 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 septembre 2024 Ambassadeur 1 536
Modifié le 25 août 2023 à 16:00

Bonjour,

Tu souhaites probablement écrire ceci :

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

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 23203 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 septembre 2024 1 536
21 août 2023 à 22:20

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 33274 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 septembre 2024 7 783 > yg_be Messages postés 23203 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 septembre 2024
25 août 2023 à 16:11

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 40228 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 20 septembre 2024 9 337
Modifié le 25 août 2023 à 16:02

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