J'ai ce programme qui calcule le temps pris pour répondre à une question spécifique et quitte la boucle while lorsque la réponse est incorrecte, mais je veux supprimer le dernier calcul, afin que je puisse appeler min()
et que ce ne soit pas le mauvais moment, désolé si cela est déroutant.
from time import time
q = input('What do you want to type? ')
a = ' '
record = []
while a != '':
start = time()
a = input('Type: ')
end = time()
v = end-start
record.append(v)
if a == q:
print('Time taken to type name: {:.2f}'.format(v))
else:
break
for i in record:
print('{:.2f} seconds.'.format(i))
Si j'ai bien compris la question, vous pouvez utiliser la notation de découpage pour tout conserver sauf le dernier élément:
record = record[:-1]
Mais un meilleur moyen consiste à supprimer directement l'élément:
del record[-1]
Note 1: Notez que l'utilisation de record = record [: - 1] ne supprime pas vraiment le dernier élément, mais affecte la sous-liste à l'enregistrement. Cela fait une différence si vous l'exécutez dans une fonction et que l'enregistrement est un paramètre. Avec record = record [: - 1], la liste d'origine (en dehors de la fonction) est inchangée. Avec del record [-1] ou record.pop (), la liste est modifiée. (comme indiqué par @pltrdy dans les commentaires)
Remarque 2: le code pourrait utiliser certains idiomes Python. Je recommande fortement de lire ceci:
Code comme un Pythonista: Python idiomatique (via l’archive wayback machine).
vous devriez utiliser ceci
del record[-1]
Le problème avec
record = record[:-1]
Est-ce que cela fait une copie de la liste chaque fois que vous supprimez un élément, donc n'est pas très efficace
list.pop()
supprime et renvoie le dernier élément de la liste.
Vous avez besoin:
record = record[:-1]
avant la boucle for
.
Ceci définira record
sur la liste actuelle record
mais sans le dernier élément. Selon vos besoins, vous pouvez vous assurer que la liste n'est pas vide avant de le faire.
Si vous faites beaucoup avec le timing, je peux recommander ce petit gestionnaire de contexte (20 lignes):
Votre code pourrait ressembler à ceci alors:
#!/usr/bin/env python
# coding: utf-8
from timer import Timer
if __== '__main__':
a, record = None, []
while not a == '':
with Timer() as t: # everything in the block will be timed
a = input('Type: ')
record.append(t.elapsed_s)
# drop the last item (makes a copy of the list):
record = record[:-1]
# or just delete it:
# del record[-1]
Juste pour référence, voici le contenu du gestionnaire de contexte Timer dans son intégralité:
from timeit import default_timer
class Timer(object):
""" A timer as a context manager. """
def __init__(self):
self.timer = default_timer
# measures wall clock time, not CPU time!
# On Unix systems, it corresponds to time.time
# On Windows systems, it corresponds to time.clock
def __enter__(self):
self.start = self.timer() # measure start time
return self
def __exit__(self, exc_type, exc_value, exc_traceback):
self.end = self.timer() # measure end time
self.elapsed_s = self.end - self.start # elapsed time, in seconds
self.elapsed_ms = self.elapsed_s * 1000 # elapsed time, in milliseconds
Si vous avez une liste de listes (tracked_output_sheet dans mon cas), où vous souhaitez supprimer le dernier élément de chaque liste, vous pouvez utiliser le code suivant:
interim = []
for x in tracked_output_sheet:interim.append(x[:-1])
tracked_output_sheet= interim