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

148

J'ai ce programme qui calcule le temps nécessaire 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, donc je peux appeler min()et ce n'est pas le mauvais moment, désolé si Ceci 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))
Samir
la source

Réponses:

233

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 une meilleure façon est de supprimer directement l'élément:

del record[-1]

Remarque 1: Notez que l'utilisation de record = record [: - 1] ne supprime pas vraiment le dernier élément, mais affecte la sous-liste à enregistrer. 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 peut utiliser certains idiomes Python. Je recommande vivement de lire ceci:
Code Like a Pythonista: Idiomatic Python (via les archives de la machine wayback).

Sébastien
la source
1
Lien génial, je le garde dans ma poche arrière.
SethMMorton
del record [-1] a des effets secondaires. C'est une mauvaise conception et doit être évitée si possible.
Longurimont
149

vous devriez utiliser ceci

del record[-1]

Le problème avec

record = record[:-1]

Est-ce qu'il fait une copie de la liste chaque fois que vous supprimez un élément, ce n'est donc pas très efficace

John La Rooy
la source
7
C'est une meilleure solution que la réponse acceptée.
Geoff Lentsch
107

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

Maciej Gol
la source
9

Vous avez besoin:

record = record[:-1]

avant la forboucle.

Cela sera défini recordsur la recordliste actuelle mais sans le dernier élément. Vous pouvez, selon vos besoins, vouloir vous assurer que la liste n'est pas vide avant de faire cela.

paxdiablo
la source
3
Pourriez-vous également utiliser record.pop()? (NB: je suis très nouveau en python)
CodeBeard
2
Oui, vous pouvez également utiliser record.pop (). Voir docs.python.org/3.3/tutorial/datastructures.html
sebastian
2
@CodeBeard, vous pouvez utiliser popmais ce n'est pas vraiment nécessaire si vous voulez simplement jeter l'objet.
paxdiablo
2
Assurez-vous de ne pas affecter la valeur renvoyée par pop () à l'enregistrement. Sinon, vous stockez la dernière valeur de la liste dans l'enregistrement.
sebastian
1
@paxdiablo et Bastiano9 - merci - le fait de ne pas utiliser le retour a-t-il un impact sur les performances?
CodeBeard
3

Si vous faites beaucoup avec le timing, je peux vous 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 __name__ == '__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
Miku
la source
En fait, c'est la première fois que j'écris un programme, mais quand je me familiariserai un peu plus avec le module, je l'examinerai, merci!
Samir
3

utilisez simplement list.pop() maintenant si vous le souhaitez dans l'autre sens, utilisez:list.popleft()

Greko2015 GuFn
la source
1

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
FlyingZebra1
la source