Come eliminare l'ultimo elemento nell'elenco?


148

Ho questo programma che calcola il tempo impiegato per rispondere a una domanda specifica e esce dal ciclo while quando la risposta è errata, ma voglio eliminare l'ultimo calcolo, quindi posso chiamare min()e non essere l'ora sbagliata, scusate se questo è confusionario.

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

Risposte:


233

Se ho capito correttamente la domanda, puoi usare la notazione slicing per mantenere tutto tranne l'ultimo elemento:

record = record[:-1]

Ma un modo migliore è quello di eliminare direttamente l'elemento:

del record[-1]

Nota 1: Notare che l'utilizzo di record = record [: - 1] non rimuove realmente l'ultimo elemento, ma assegna l'elenco secondario da registrare. Questo fa la differenza se lo si esegue all'interno di una funzione e il record è un parametro. Con record = record [: - 1] l'elenco originale (al di fuori della funzione) rimane invariato, con del record [-1] o record.pop () l'elenco viene modificato. (come affermato da @pltrdy nei commenti)

Nota 2: il codice potrebbe usare alcuni idiomi di Python. Consiglio vivamente di leggere questo:
Code Like a Pythonista: Idiomatic Python (tramite l'archivio macchina di ritorno).


1
Link fantastico, lo terrò nella tasca posteriore.
SethMMorton,

del record [-1] ha effetti collaterali. Questo è un cattivo design e dovrebbe essere evitato se possibile.
Longurimont,

149

dovresti usare questo

del record[-1]

Il problema con

record = record[:-1]

È che crea una copia dell'elenco ogni volta che rimuovi un elemento, quindi non è molto efficiente


7
Questa è una soluzione migliore della risposta accettata.
Geoff Lentsch,

107

list.pop() rimuove e restituisce l'ultimo elemento dell'elenco.


9

Hai bisogno:

record = record[:-1]

prima del forciclo.

Questo verrà impostato sull'elenco recordcorrente recordma senza l'ultimo elemento. A seconda delle tue esigenze, potresti voler assicurarti che l'elenco non sia vuoto prima di farlo.


3
Potresti anche usare record.pop()? (NB: sono molto nuovo su Python)
CodeBeard

2
Sì, puoi anche usare record.pop (). Vedi docs.python.org/3.3/tutorial/datastructures.html
sebastian l'

2
@CodeBeard, si potrebbe usare pop, ma non è davvero necessario se si vuole solo buttare via la voce.
paxdiablo,

2
Assicurati di non assegnare il valore restituito da pop () per la registrazione. Altrimenti stai memorizzando l'ultimo valore dell'elenco nel record.
sebastian,

1
@paxdiablo e Bastiano9 - grazie - c'è un impatto sulle prestazioni nel non usare il ritorno?
CodeBeard,

3

Se fai molto con i tempi, posso consigliare questo piccolo gestore di contesto (20 righe):

Il tuo codice potrebbe apparire così:

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

Solo per riferimento, ecco il contenuto del gestore del contesto Timer per intero:

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

In realtà questo è il primo programma "time" che ho scritto, ma quando avrò un po 'più familiarità con il modulo, darò un'occhiata in esso, grazie!
Samir,

3

usa semplicemente list.pop() ora se lo vuoi nell'altro modo usa:list.popleft()


1

Se hai un elenco di elenchi ( tracked_output_sheet nel mio caso), in cui desideri eliminare l'ultimo elemento da ciascun elenco, puoi utilizzare il seguente codice:

interim = []
for x in tracked_output_sheet:interim.append(x[:-1])
tracked_output_sheet= interim
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.