web-dev-qa-db-fra.com

Comment supprimer le dernier élément de la liste?

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))
96
Samir

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).

151
sebastian

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

133
John La Rooy

list.pop() supprime et renvoie le dernier élément de la liste.

74
Maciej Gol

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.

8
paxdiablo

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
3
miku

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
1
FlyingZebra1