Como excluir o último item da lista?

148

Eu tenho este programa que calcula o tempo necessário para responder a uma pergunta específica e sai do loop while quando a resposta está incorreta, mas eu quero excluir o último cálculo, para que eu possa ligar min()e não seja a hora errada, desculpe se isso é 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
fonte

Respostas:

233

Se entendi a pergunta corretamente, você pode usar a notação de fatia para manter tudo, exceto o último item:

record = record[:-1]

Mas uma maneira melhor é excluir o item diretamente:

del record[-1]

Nota 1: Observe que o uso de record = record [: - 1] não remove realmente o último elemento, mas atribui a sublist ao registro. Isso faz a diferença se você a executar dentro de uma função e o registro for um parâmetro. Com record = record [: - 1] a lista original (fora da função) permanece inalterada, com del record [-1] ou record.pop () a lista é alterada. (como afirma @pltrdy nos comentários)

Nota 2: O código pode usar alguns idiomas do Python. Eu recomendo a leitura:
Code Like a Pythonista: Idiomatic Python (via arquivo de máquina wayback ).

sebastiano
fonte
1
Link incrível, vou mantê-lo no meu bolso de trás.
SethMMorton
del record [-1] tem efeitos colaterais. Este é um design ruim e deve ser evitado, se possível.
Longurimont 26/11/19
149

você deveria usar isso

del record[-1]

O problema com

record = record[:-1]

É que ele faz uma cópia da lista toda vez que você remove um item, por isso não é muito eficiente

John La Rooy
fonte
7
Esta é uma solução melhor que a resposta aceita.
Geoff Lentsch
107

list.pop() remove e retorna o último elemento da lista.

Maciej Gol
fonte
9

Você precisa:

record = record[:-1]

antes do forloop.

Isso será definido recordna recordlista atual, mas sem o último item. Dependendo das suas necessidades, você pode garantir que a lista não esteja vazia antes de fazer isso.

paxdiablo
fonte
3
Você também pode usar record.pop()? (NB: Eu sou muito novo para python)
CodeBeard
2
Sim, você também pode usar record.pop (). Veja docs.python.org/3.3/tutorial/datastructures.html
sebastian
2
@ CodeBeard, você poderia usar, popmas não é realmente necessário se você quiser apenas jogar o item fora.
paxdiablo
2
Verifique se você não está atribuindo o valor retornado por pop () para gravar. Caso contrário, você está armazenando o último valor da lista em registro.
sebastian
1
@paxdiablo e Bastiano9 - obrigado - há um impacto no desempenho ao não usar o retorno?
CodeBeard
3

Se você faz muito com o tempo, posso recomendar este pequeno gerenciador de contexto (20 linhas):

Seu código pode ficar assim:

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

Apenas para referência, aqui está o conteúdo do gerenciador de contexto do Timer na íntegra:

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
fonte
Na verdade, esse é o primeiro programa que escrevi, mas quando eu me familiarizar um pouco com o módulo, vou dar uma olhada nele, obrigado!
Samir
3

simplesmente use list.pop() agora se você quiser do outro modo:list.popleft()

Greko2015 GuFn
fonte
1

Se você tiver uma lista de listas ( tracked_output_sheet no meu caso), onde deseja excluir o último elemento de cada lista, poderá usar o seguinte código:

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