Як видалити останній елемент у списку?


148

У мене є ця програма, яка обчислює час, необхідний для відповіді на певне запитання, і вимикається з циклу час, коли відповідь невірна, але я хочу видалити останній розрахунок, тому я можу зателефонувати, min()і це не буде неправильний час, вибачте, якщо це заплутано.

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

Відповіді:


233

Якщо я правильно зрозумів питання, ви можете використовувати позначення нарізки, щоб зберегти все, крім останнього:

record = record[:-1]

Але кращим способом є видалення елемента безпосередньо:

del record[-1]

Примітка 1: Зауважте, що за допомогою record = record [: - 1] насправді не видаляється останній елемент, але призначається підпис для запису. Це має значення, якщо запустити його всередині функції, а запис - це параметр. З записом = запис [: - 1] вихідний список (за межами функції) не змінюється, при del zapis [-1] або record.pop () список змінюється. (як зазначено в коментарях @pltrdy)

Примітка 2: Код може використовувати деякі ідіоми Python. Я настійно рекомендую прочитати це:
Code Like a Pythonista: Idiomatic Python (через машинний архів зворотного зв'язку).


1
Дивовижне посилання, я зберігатиму його в задній кишені.
SethMMorton

del rek [-1] має побічні ефекти. Це погана конструкція і її слід уникати, якщо можливо.
Лонгурімонт

149

ви повинні використовувати це

del record[-1]

Проблема з

record = record[:-1]

Це те, що вона робить копію списку кожного разу, коли ви видаляєте елемент, тому не дуже ефективно


7
Це краще рішення, ніж прийнята відповідь.
Джефф Ленч


9

Тобі потрібно:

record = record[:-1]

перед forциклом.

Це встановить recordпоточний recordсписок, але без останнього пункту. Ви можете, залежно від ваших потреб, переконатися, що список не порожній, перш ніж робити це.


3
Чи можете ви також використовувати record.pop()? (NB: Я дуже новачок у python)
CodeBeard

2
Так, ви також можете використовувати record.pop (). Дивіться docs.python.org/3.3/tutorial/datastructures.html
sebastian

2
@CodeBeard, ви можете використовувати, popале це не дуже потрібно, якщо ви просто хочете викинути предмет.
paxdiablo

2
Переконайтеся, що ви не присвоюєте значення, яке повертається pop () для запису. Інакше ви зберігаєте останнє значення списку в записі.
себастьян

1
@paxdiablo та Bastiano9 - спасибі - чи впливає на ефективність використання не повернення?
CodeBeard

3

Якщо ви дуже багато займаєтеся тимчасовим режимом, я можу порекомендувати цей маленький (20 рядковий) контекстний менеджер:

Тоді код може виглядати приблизно так:

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

Тільки для довідки, ось вміст Менеджера контекстів Таймера повністю:

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

Насправді це перша програма, яку я написала "раз", але коли я трохи більше ознайомлюся з модулем, я погляну на це, дякую!
Самір

3

просто просто використовуйте list.pop() зараз, якщо ви хочете, щоб це було іншим способом:list.popleft()


1

Якщо у вас є список списків ( tracked_output_sheet в моєму випадку), де ви хочете видалити останній елемент із кожного списку, ви можете використовувати такий код:

interim = []
for x in tracked_output_sheet:interim.append(x[:-1])
tracked_output_sheet= interim
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.