0
votes

Comment avoir une liste contenant les 10 valeurs les plus récentes d'une itération?

Je veux avoir une liste contenant les dix valeurs les plus récentes calculées dans un pour boucle. J'ai essayé de supprimer l'élément i-10 de la liste, puis appendez la valeur calculée dans le i'th itération. Voici ce que j'ai essayé: xxx

Cependant, je reçois cette erreur: xxx

Je ne sais pas pourquoi ceci est, comme le La liste est assez longue, assurée par la condition. Merci pour tout conseil.


3 commentaires

Si vous mettez impression (i) dans la boucle, vous verriez clairement qu'il échoue lorsque i = 20, et aurait probablement été en mesure de déterminer ce qui se passe mal.


@alaniwi tu as raison, merci


Le module de collections intégré comprend DEQUE qui peut utiliser juste < Code> Points = DEQUE (MAXLEN = 10) ET AJOUVEL ajouté.


6 Réponses :


4
votes

Votre liste ne pousse jamais plus de 10 éléments, car dès qu'il passe à la longueur 10, vous commencez à supprimer le premier élément avant d'en ajouter un. Par conséquent, lorsque i est supérieur à 19, l'index I - 10 est hors de portée de la liste.

Vous ajoutez toujours à la fin de la liste, et logiquement seulement vouloir supprimer l'élément premier . Par conséquent, remplacez les points del [i-10] par del points [0] : xxx


0 commentaires

0
votes

Changer del Points [I - 10] à del Points [0] Comme lorsque j'atteint 20, il essaie de supprimer l'index 10 qui n'existe pas. Alors changez-le à 0.


0 commentaires

1
votes

Bien sûr, vous avez un index hors de portée! Vous ne conservez que 10 articles dans la liste, mais i code> jusqu'à 999! S'il n'y a que 10 éléments de la liste, comment imaginez-vous que vous pouvez indexer l'élément 998 - 10 code>?

Vous devez imaginer cela comme une file d'attente: une structure de données dans laquelle vous prenez des articles hors de l'avant et ajoutez-les à la fin. En fait, le package Collections code> a une telle structure de données. Toutefois, pour vos propres objectifs, faites ce que vous avez dit em> vous alliez faire: Débarrassez-vous du produit le plus ancien: P>

[-971279100, -974224352, -977175552, -980132706, -983095820,
 -986064900, -989039952, -992020982, -995007996, -998001000]


0 commentaires

0
votes

C'est ce que vous voulez:

points = []

x = 0
for i in range(1000):
    x += 1

    if i > 9: # to check when to start removing the first element
        del points[0]
        points.append(i * x * (1 - x)) # appending the value calculating
    else:
        points.append(i * x * (1 - x))


3 commentaires

Qu'est-ce que cela ajoute aux réponses précédentes?


@Prune, peu importe si cela ajoute quelque chose ou non, cela m'aide à comprendre la solution de différentes perspectives et que la personne pose la question, c'est très utile pour moi.


@Prune, désolé, ma réponse a traversé l'autre dans l'éther.



2
votes

Vous pouvez commencer par créer une liste de longueur 10, puis vélo simplement les indices. Pour extraire les valeurs, vous devrez extraire les tranches de index + 1 à la fin, puis à partir de l'index de début à (où index est l'index actuel de la liste des points, c'est-à-dire i% 10 ).

Ce sera beaucoup plus efficace que la modification d'une liste, car la suppression du premier élément d'une liste a une complexité de temps O (n ). xxx

Si vous souhaitez la sortie sans Aucun et que les éléments commandés du plus ancien au plus ancien, vous pouvez les imprimer comme ceci: xxx


0 commentaires

2
votes

Pensez à ce qui se passe lorsque i code> est 100: vous essayez de supprimer l'élément dans Points [90] code> mais votre liste n'a que la longueur de 10 heures. d'erreur de portée. Vraiment, vous souhaitez supprimer le premier élément de la liste à chaque fois. De sorte que cette ligne devrait lire del points [0] code>.

Cependant, une manière beaucoup plus efficace de cela consiste à utiliser Tranchement Pour toujours s'assurer que la liste n'est pas supérieure à 10 long: p>

points = []

for i in range(1000):
    x = i+1
    points.append(i * x * (1 - x))
    points = points[-10:]


0 commentaires