如何删除列表中的最后一项?
Posted
技术标签:
【中文标题】如何删除列表中的最后一项?【英文标题】:How to delete last item in list? 【发布时间】:2013-08-12 18:13:49 【问题描述】:我有这个程序可以计算回答特定问题所需的时间,并在答案不正确时退出 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))
【问题讨论】:
你试过lst.pop()
吗?
【参考方案1】:
你需要:
record = record[:-1]
for
循环之前。
这会将record
设置为当前的record
列表,但没有最后一项。根据您的需要,您可能希望在执行此操作之前确保列表不为空。
【讨论】:
你也可以使用record.pop()
吗? (注意:我对 python 很陌生)
是的,你也可以使用 record.pop()。见docs.python.org/3.3/tutorial/datastructures.html
@CodeBeard,您可以使用pop
,但如果您只是想将物品扔掉,则没有必要。
确保您不将 pop() 返回的值分配给记录。否则,您会将列表的最后一个值存储在记录中。
@paxdiablo 和 Bastiano9 - 谢谢 - 不使用回报会影响性能吗?【参考方案2】:
如果我正确理解了这个问题,您可以使用切片符号来保留除最后一项之外的所有内容:
record = record[:-1]
但更好的方法是直接删除该项:
del record[-1]
注意 1:注意使用 record = record[:-1] 并没有真正删除最后一个元素,而是将子列表分配给记录。如果您在函数中运行它并且记录是一个参数,这会有所不同。使用 record = record[:-1] 原始列表(函数外部)未更改,使用 del record[-1] 或 record.pop() 更改列表。 (如 @pltrdy 在 cmets 中所述)
注意 2:代码可以使用一些 Python 习语。我强烈建议您阅读以下内容:Code Like a Pythonista: Idiomatic Python(通过 Wayback 机器存档)。
【讨论】:
删除记录[-1] 有副作用。这是一个糟糕的设计,应尽可能避免。 @Longurimont 你能解释一下它有什么副作用吗? @M. Volf 这在这里得到了很好的讨论:***.com/questions/11520492/… tl:dr 唯一的问题可能是在一个循环中,任何方法都会遇到同样的问题 @TheDavidFactor 我在那里没有看到任何关于del x[-1]
的信息
也许我误解了@Logurimont 的原始评论,但括号内的任何内容都只是切片符号,所以我认为问题出在 del 上。使用 del 在我引用的问题的公认答案中得到了解决。切片符号记录在这里:python-reference.readthedocs.io/en/latest/docs/brackets/…【参考方案3】:
如果你在计时方面做得很多,我可以推荐这个小(20 行)上下文管理器:
https://github.com/brouberol/timer-context-manager你的代码可能看起来像这样:
#!/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
【讨论】:
其实这是我写的第一个'time'程序,等我对这个模块再熟悉一些,我再看看,谢谢!【参考方案4】:你应该使用这个
del record[-1]
问题
record = record[:-1]
是不是每次你删除一个项目时都会复制一份列表,所以效率不高
【讨论】:
这是一个比公认答案更好的解决方案。【参考方案5】:list.pop()
移除并返回列表的最后一个元素。
【讨论】:
【参考方案6】:如果你有一个列表列表(在我的例子中是tracked_output_sheet),你想从每个列表中删除最后一个元素,你可以使用以下代码:
interim = []
for x in tracked_output_sheet:interim.append(x[:-1])
tracked_output_sheet= interim
【讨论】:
【参考方案7】:只需使用list.pop()
现在,如果您想要它,请使用其他方式:list.popleft()
【讨论】:
【参考方案8】:您必须使用 *list,_ = list,如下例所示
record = [1,2,3]
*record,_ = record
record
---
[1, 2]
【讨论】:
这确实是一种非常Pythonic的方式以上是关于如何删除列表中的最后一项?的主要内容,如果未能解决你的问题,请参考以下文章