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

4 minutos de lectura

avatar de usuario
samir

Tengo este programa que calcula el tiempo necesario para responder una pregunta específica y sale del bucle while cuando la respuesta es incorrecta, pero quiero eliminar el último cálculo, así que puedo llamar min() y no sea 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))

  • has probado lst.pop()?

    –Charlie Parker

    30 de noviembre de 2020 a las 20:10

avatar de usuario
sebastián

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 usar record = record[:-1] en realidad no elimina el último elemento, sino que asigna la sublista al registro. Esto marca la diferencia si lo ejecuta dentro de una función y el registro es un parámetro. Con registro = registro[:-1] la lista original (fuera de la función) no cambia, con del record[-1] o record.pop() la lista cambia. (según lo declarado por @pltrdy en los comentarios)

Nota 2: el código podría usar algunos modismos de Python. Recomiendo encarecidamente leer esto:
Codifique como un Pythonista: Python idiomático (a través del archivo de la máquina wayback).

  • del registro[-1] tiene efectos secundarios. Este es un mal diseño y debe evitarse si es posible.

    – Hombre Montaña

    26 de noviembre de 2019 a las 22:10


  • @Longurimont, ¿puede explicar qué efectos secundarios tiene?

    – M.Volf

    13 de septiembre de 2020 a las 18:51

  • @METRO. Volf, esto se discute bastante bien aquí: stackoverflow.com/questions/11520492/… tl: dr solo el problema podría estar en un bucle y tendría los mismos problemas con cualquier enfoque

    – El Factor David

    14 de septiembre de 2020 a las 19:12

  • @TheDavidFactor No veo nada sobre del x[-1] allá

    – M.Volf

    14 de septiembre de 2020 a las 19:16

  • Tal vez no entendí bien el comentario original de @Logurimont, pero cualquier cosa dentro de un paréntesis es simplemente una notación de corte, así que asumí que el problema estaba en la del. el uso de del se abordó en la respuesta aceptada de la pregunta a la que hice referencia. La notación de corte se documenta aquí: python-reference.readthedocs.io/en/latest/docs/brackets/…

    – El Factor David

    14/09/2020 a las 19:30


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

  • Esta es una mejor solución que la respuesta aceptada.

    – Geoff Lentsch

    08/12/2017 a las 21:00

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

  • Con la mención de que arroja un IndexError si la lista está vacía. En caso de que no quiera probar/excepto, hay mejores opciones.

    – Adrián Pop

    13 de mayo a las 14:16

avatar de usuario
paxdiablo

Necesitas:

record = record[:-1]

antes de for círculo.

Esto establecerá record a la corriente record lista pero sin que el último artículo. Es posible que, según sus necesidades, desee asegurarse de que la lista no esté vacía antes de hacer esto.

simplemente usa list.pop()
ahora, si lo quieres de otra manera, usa: list.popleft()

  • Con la mención de que arroja un IndexError si la lista está vacía. En caso de que no quiera probar/excepto, hay mejores opciones.

    – Adrián Pop

    13 de mayo a las 14:16

avatar de usuario
zardilior

Debes usar *list,_ = list como en el siguiente ejemplo

record = [1,2,3]
*record,_ = record
record
---
[1, 2]

  • Con la mención de que arroja un IndexError si la lista está vacía. En caso de que no quiera probar/excepto, hay mejores opciones.

    – Adrián Pop

    13 de mayo a las 14:16

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

Tu 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 de la Temporizador administrador de contexto en su totalidad:

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

  • En realidad, este es el primer programa de ‘tiempo’ que escribo, pero cuando me familiarice un poco más con el módulo, le echaré un vistazo, ¡gracias!

    – Samir

    11 de agosto de 2013 a las 8:14

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad