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