Wie lösche ich das letzte Element in der Liste?

146

Ich habe dieses Programm, das die Zeit berechnet, die für die Beantwortung einer bestimmten Frage benötigt wird, und die while-Schleife verlässt, wenn die Antwort falsch ist, aber ich möchte die letzte Berechnung löschen, damit ich anrufen kann min()und es nicht die falsche Zeit ist, sorry, wenn das ist verwirrend.

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
quelle

Antworten:

230

Wenn ich die Frage richtig verstanden habe, können Sie die Slicing-Notation verwenden, um alles außer dem letzten Element beizubehalten:

record = record[:-1]

Besser ist es jedoch, das Element direkt zu löschen:

del record[-1]

Hinweis 1: Beachten Sie, dass bei Verwendung von record = record [: - 1] das letzte Element nicht wirklich entfernt wird, sondern die Unterliste dem Datensatz zugewiesen wird. Dies macht einen Unterschied, wenn Sie es innerhalb einer Funktion ausführen und record ein Parameter ist. Bei record = record [: - 1] bleibt die ursprüngliche Liste (außerhalb der Funktion) unverändert, bei del record [-1] oder record.pop () wird die Liste geändert. (wie von @pltrdy in den Kommentaren angegeben)

Hinweis 2: Der Code könnte einige Python-Redewendungen verwenden. Ich empfehle dringend, dies zu lesen:
Code wie ein Pythonista: Idiomatisches Python (über das Wayback-Maschinenarchiv).

Sebastian
quelle
1
Super Link, ich werde ihn in meiner Gesäßtasche behalten.
SethMMorton
del record [-1] hat Nebenwirkungen. Dies ist ein schlechtes Design und sollte nach Möglichkeit vermieden werden.
Longurimont
149

Sie sollten dies verwenden

del record[-1]

Das Problem mit

record = record[:-1]

Ist, dass es jedes Mal, wenn Sie ein Element entfernen, eine Kopie der Liste erstellt, ist dies nicht sehr effizient

John La Rooy
quelle
7
Dies ist eine bessere Lösung als die akzeptierte Antwort.
Geoff Lentsch
106

list.pop() Entfernt das letzte Element der Liste und gibt es zurück.

Maciej Gol
quelle
9

Du brauchst:

record = record[:-1]

vor der forSchleife.

Dies wird recordauf die aktuelle recordListe gesetzt, jedoch ohne das letzte Element. Abhängig von Ihren Anforderungen möchten Sie möglicherweise sicherstellen, dass die Liste nicht leer ist, bevor Sie dies tun.

paxdiablo
quelle
3
Könnten Sie auch verwenden record.pop()? (NB: Ich bin sehr neu in Python)
CodeBeard
2
Ja, Sie können auch record.pop () verwenden. Siehe docs.python.org/3.3/tutorial/datastructures.html
Sebastian
2
@CodeBeard, Sie könnten verwenden, popaber es ist nicht wirklich notwendig, wenn Sie nur den Gegenstand wegwerfen wollen.
Paxdiablo
2
Stellen Sie sicher, dass Sie den von pop () zurückgegebenen Wert nicht für die Aufzeichnung zuweisen. Andernfalls speichern Sie den letzten Wert der Liste im Datensatz.
Sebastian
1
@paxdiablo und Bastiano9 - danke - gibt es einen Leistungseinfluss, wenn die Rückgabe nicht verwendet wird?
CodeBeard
3

Wenn Sie viel mit dem Timing anfangen, kann ich diesen kleinen Kontextmanager (20 Zeilen) empfehlen:

Ihr Code könnte dann so aussehen:

#!/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]

Nur als Referenz, hier ist der Inhalt des Timer- Kontextmanagers vollständig:

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
quelle
Eigentlich ist dies das erste "Zeit" -Programm, das ich geschrieben habe, aber wenn ich mich ein wenig mit dem Modul vertraut mache, werde ich es mir ansehen, danke!
Samir
3

Verwenden list.pop() Sie es jetzt einfach, wenn Sie es andersherum verwenden möchten.list.popleft()

Greko2015 GuFn
quelle
1

Wenn Sie eine Liste von Listen haben ( in meinem Fall tracked_output_sheet ), in der Sie das letzte Element aus jeder Liste löschen möchten, können Sie den folgenden Code verwenden:

interim = []
for x in tracked_output_sheet:interim.append(x[:-1])
tracked_output_sheet= interim
FlyingZebra1
quelle