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

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

你需要:

record = record[:-1]

for循环之前。

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

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

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 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()删除并返回列表的最后一个元素。

如果你有一个列表列表(在我的例子中是tracked_output_sheet),你想从每个列表中删除最后一个元素,你可以使用以下代码:

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]