¿Cómo eliminar el último elemento de la lista?

148

Tengo este programa que calcula el tiempo necesario para responder una pregunta específica y se cierra del ciclo while cuando la respuesta es incorrecta, pero quiero eliminar el último cálculo, por lo que puedo llamar min()y no es el momento equivocado, lo siento si esto es confuso.

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
fuente

Respuestas:

233

Si entendí la pregunta correctamente, puede usar la notación de corte para mantener todo excepto el último elemento:

record = record[:-1]

Pero una mejor manera es eliminar el elemento directamente:

del record[-1]

Nota 1: Tenga en cuenta que el uso de record = record [: - 1] no elimina realmente el último elemento, sino que asigna la sublista para grabar. Esto hace la diferencia si lo ejecuta dentro de una función y el registro es un parámetro. Con record = record [: - 1] la lista original (fuera de la función) no cambia, con del record [-1] o record.pop () la lista cambia. (como lo indica @pltrdy en los comentarios)

Nota 2: El código podría usar algunos modismos de Python. Recomiendo leer esto:
Code Like a Pythonista: Idiomatic Python (a través del archivo de máquina de wayback).

sebastian
fuente
1
Enlace impresionante, lo guardaré en mi bolsillo trasero.
SethMMorton
del record [-1] tiene efectos secundarios. Este es un mal diseño y debe evitarse si es posible.
Longurimont
149

deberías usar esto

del record[-1]

El problema con

record = record[:-1]

Es que hace una copia de la lista cada vez que elimina un elemento, por lo que no es muy eficiente

John La Rooy
fuente
77
Esta es una mejor solución que la respuesta aceptada.
Geoff Lentsch
107

list.pop() elimina y devuelve el último elemento de la lista.

Maciej Gol
fuente
9

Necesitas:

record = record[:-1]

antes del forbucle.

Esto se establecerá recorden la recordlista actual pero sin el último elemento. Es posible que, según sus necesidades, desee asegurarse de que la lista no esté vacía antes de hacer esto.

paxdiablo
fuente
3
¿También podrías usar record.pop()? (Nota: soy muy nuevo en python)
CodeBeard
2
Sí, también puedes usar record.pop (). Ver docs.python.org/3.3/tutorial/datastructures.html
sebastian
2
@CodeBeard, se podría utilizar poppero no es realmente necesario si sólo quiere tirar el elemento de distancia.
paxdiablo
2
Asegúrese de no asignar el valor devuelto por pop () para grabar. De lo contrario, está almacenando el último valor de la lista en el registro.
sebastian
1
@paxdiablo y Bastiano9 - gracias - ¿hay un impacto en el rendimiento al no usar el retorno?
CodeBeard
3

Si haces mucho con el tiempo, puedo recomendar este pequeño administrador de contexto (20 líneas):

Su código podría verse así entonces:

#!/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 como referencia, aquí está el contenido del administrador de contexto Timer completo:

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
fuente
En realidad, este es el primer programa de 'tiempo' que he escrito, pero cuando me familiarice un poco más con el módulo, lo echaré un vistazo, ¡gracias!
Samir
3

simplemente use list.pop() ahora si lo desea de otra manera use:list.popleft()

Greko2015 GuFn
fuente
1

Si tiene una lista de listas ( tracked_output_sheet en mi caso), donde desea eliminar el último elemento de cada lista, puede usar el siguiente código:

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