Jak usunąć ostatnią pozycję z listy?


146

Mam ten program, który oblicza czas potrzebny na udzielenie odpowiedzi na konkretne pytanie i wychodzi z pętli while, gdy odpowiedź jest niepoprawna, ale chcę usunąć ostatnie obliczenie, więc mogę zadzwonić min()i nie jest to zły czas, przepraszam, jeśli to jest mylące.

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

Odpowiedzi:


231

Jeśli dobrze zrozumiałem pytanie, możesz użyć notacji do krojenia, aby zachować wszystko oprócz ostatniego elementu:

record = record[:-1]

Ale lepszym sposobem jest bezpośrednie usunięcie elementu:

del record[-1]

Uwaga 1: Zauważ, że użycie record = record [: - 1] tak naprawdę nie usuwa ostatniego elementu, ale przypisuje podlistę do rekordu. Ma to znaczenie, jeśli uruchomisz go wewnątrz funkcji, a rekord jest parametrem. Z record = record [: - 1] oryginalna lista (poza funkcją) pozostaje niezmieniona, z del record [-1] lub record.pop () lista zostaje zmieniona. (jak stwierdził @pltrdy w komentarzach)

Uwaga 2: Kod może zawierać idiomy Pythona. Gorąco polecam przeczytanie tego:
Code Like a Pythonista: Idiomatic Python (za pośrednictwem archiwum wayback machine).


1
Świetny link, trzymam go w tylnej kieszeni.
SethMMorton,

del record [-1] ma efekty uboczne. To zły projekt i należy go unikać, jeśli to możliwe.
Longurimont

149

powinieneś tego użyć

del record[-1]

Problem z

record = record[:-1]

Chodzi o to, że tworzy kopię listy za każdym razem, gdy usuwasz element, więc nie jest zbyt wydajny


7
To lepsze rozwiązanie niż przyjęta odpowiedź.
Geoff Lentsch


9

Potrzebujesz:

record = record[:-1]

przed forpętlą.

Spowoduje to ustawienie recordbieżącej recordlisty, ale bez ostatniej pozycji. W zależności od potrzeb możesz chcieć upewnić się, że lista nie jest pusta, zanim to zrobisz.


3
Czy mógłbyś również użyć record.pop()? (Uwaga: Jestem bardzo nowy w Pythonie)
CodeBeard,

2
Tak, możesz także użyć funkcji record.pop (). Zobacz docs.python.org/3.3/tutorial/datastructures.html
sebastian

2
@CodeBeard, to mógłby użyć pop, ale to naprawdę nie jest konieczne, jeśli chcesz po prostu wyrzucić przedmiot z dala.
paxdiablo

2
Upewnij się, że nie przypisujesz wartości zwracanej przez pop () do rekordu. W przeciwnym razie przechowujesz ostatnią wartość listy w rekordzie.
sebastian

1
@paxdiablo i Bastiano9 - dzięki - czy niewykorzystanie zwrotu ma wpływ na wydajność?
CodeBeard,

3

Jeśli dużo robisz z synchronizacją, mogę polecić tego małego (20-liniowego) menedżera kontekstu:

Twój kod mógłby wtedy wyglądać tak:

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

Dla porównania, oto pełna zawartość menedżera kontekstu Timer :

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

Właściwie jest to pierwszy program „czasu”, jaki napisałem, ale kiedy trochę bardziej zaznajomię się z modułem, przyjrzę się temu, dziękuję!
Samir,


1

Jeśli masz listę list ( w moim przypadku tracked_output_sheet ), z których chcesz usunąć ostatni element z każdej listy, możesz użyć następującego kodu:

interim = []
for x in tracked_output_sheet:interim.append(x[:-1])
tracked_output_sheet= interim
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.