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

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的方式

以上是关于如何删除列表中的最后一项?的主要内容,如果未能解决你的问题,请参考以下文章

AWK - 从列表中删除最后一项

Python“for in”循环打印列表中的最后一项

如何知道单击按钮的列表项的索引

如何删除添加到列表中的最后一个元素?

删除列表列表中的第一项 - 制作副本而不是就地修改

如何删除一个list中最后一个元素