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


146

我有这个程序来计算回答一个特定问题所花费的时间,并在回答不正确时退出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))

Answers:


231

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

record = record[:-1]

但是更好的方法是直接删除该项目:

del record[-1]

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

注意2:代码可以使用一些Python惯用法。我强烈建议您阅读:
像Pythonista一样的代码:惯用的Python(通过Wayback机器档案)。


1
很棒的链接,我会把它放在后兜。
SethMMorton

del record [-1]有副作用。这是一个不好的设计,应尽可能避免。
Longurimont

149

你应该用这个

del record[-1]

问题所在

record = record[:-1]

是因为它每次删除项目时都会复制列表,所以效率不是很高


7
这是比接受的答案更好的解决方案。
Geoff Lentsch '17


9

你需要:

record = record[:-1]

for循环之前。

这将设置record为当前record列表,但没有最后一项。您可能会根据自己的需要,在执行此操作之前确保列表不为空。


3
您还可以使用record.pop()吗?(注意:我对python非常
陌生

2
是的,您也可以使用record.pop()。参见docs.python.org/3.3/tutorial/datastructures.html
sebastian

2
@CodeBeard,您可以使用,pop但是如果您只想扔掉它,那不是真正必要的。
paxdiablo

2
确保没有分配pop()返回的值进行记录。否则,您将在记录中存储列表的最后一个值。
sebastian

1
@paxdiablo和Bastiano9-谢谢-不使用返回值会对性能产生影响吗?
CodeBeard 2013年

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]

仅供参考,以下是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

实际上,这是我编写的第一个“时间”程序,但是当我对模块有了更多的了解时,我将对其进行研究,谢谢!
萨米尔

3

只是list.pop() 现在就使用,如果您愿意,可以使用另一种方法:list.popleft()


1

如果您有一个列表列表(在我的情况下为tracked_output_sheet),要在其中删除每个列表的最后一个元素,则可以使用以下代码:

interim = []
for x in tracked_output_sheet:interim.append(x[:-1])
tracked_output_sheet= interim
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.