Python 如何删除列表中的最后一项?

Python 如何删除列表中的最后一项?,python,time,python-3.x,Python,Time,Python 3.x,我有一个程序,可以计算回答特定问题所需的时间,当答案不正确时退出while循环,但我想删除最后一个计算,这样我就可以调用min(),而且现在不是错误的时间,如果这让人困惑,很抱歉 from time import time q = input('What do you want to type? ') a = ' ' record = [] while a != '': start = time() a = input('Type: ') end = time()

我有一个程序,可以计算回答特定问题所需的时间,当答案不正确时退出while循环,但我想删除最后一个计算,这样我就可以调用
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))
你需要:

record = record[:-1]
在循环的
之前


这将把
record
设置为当前
record
列表,但不包括最后一项。根据您的需要,您可能希望在执行此操作之前确保列表不为空。

如果我正确理解了问题,您可以使用切片符号保留除最后一项之外的所有内容:

record = record[:-1]
但更好的方法是直接删除该项:

del record[-1]
注1:请注意,使用record=record[:-1]并不会真正删除最后一个元素,而是将子列表分配给record。如果您在函数中运行它,并且记录是一个参数,则会产生不同。使用record=record[:-1]时,原始列表(函数外部)不变,使用del record[-1]或record.pop()时,列表会发生更改。(如@pltrdy在评论中所述)

注2:代码可以使用一些Python习惯用法。我强烈建议您阅读以下内容:

(通过wayback machine archive)。

如果您在计时方面做了大量工作,我可以推荐这个小型(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
你应该用这个

del record[-1]
问题在于

record = record[:-1]

它会在每次删除项目时复制列表,因此效率不高。

list.pop()
删除并返回列表的最后一个元素。

如果您有列表列表(在我的例子中是跟踪的输出表),其中您要从每个列表中删除最后一个元素,可以使用以下代码:

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

只需使用
list.pop()

现在,如果您想以另一种方式使用它,请使用:
list.popleft()

您必须使用*list,{=list,如下例所示

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

您是否也可以使用
record.pop()
?(注意:我对python非常陌生)是的,您也可以使用record.pop()。请参见@CodeBeard,您可以使用
pop
,但如果您只是想扔掉该项目,则实际上不需要使用它。请确保您没有将pop()返回的值指定给record。否则,您将在记录中存储列表的最后一个值。@paxdiablo和Bastiano9-谢谢-不使用返回是否会对性能产生影响?实际上,这是我第一次编写程序,但当我对该模块稍微熟悉一点时,我会研究一下,谢谢!这是一个比公认的答案更好的解决方案。
val=lst.pop()有什么问题?
?del record[-1]有副作用。这是一个糟糕的设计,如果可能的话应该避免。@Longurimont你能解释一下它有什么副作用吗?@M.Volf这在这里讨论得很好:tl:dr唯一的问题可能在一个循环中,你对任何问题都会有同样的问题approach@TheDavidFactor我没有看到任何关于
delx[-1]
也许我误解了@Logurimont的原始注释,但括号内的任何内容都只是切片符号,所以我认为问题在于del。在我提到的问题的公认答案中提到了使用del。切片表示法记录在这里:您是否尝试过
lst.pop()