从Python列表中弹出所有项目

4
我想知道是否有一种方法可以在Python中“弹出”列表中的所有项?这可以通过几行代码来实现,但是操作似乎非常简单,我认为一定有比制作副本并清空原始副本更好的方法。我已经在Google上搜索了很多,也在这里搜索过,但都没有找到解决方法。我意识到弹出所有项将只返回原始列表的副本,但这正是我想要做的。我不想返回列表,而是其中包含的所有项目,同时清除它。
class ListTest():
    def __init__(self):
        self._internal_list = range(0, 10)

    def pop_all(self):
        result, self._internal_list = self._internal_list[:], []
        return result

        # ... instead of:
        # return self._internal_list.pop_all()


t = ListTest()

print "popped: ", t.pop_all()
print "popped: ", t.pop_all()

...这当然返回了预期的结果:

popped:  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
popped:  []

3
你已经找到了实现它的方法,只需要清空列表即可。 - Martijn Pieters
这就是正确的做法。由于弹出所有项意味着“复制,然后清空”,因此没有必要有一个方法来执行此操作。 - Fred Foo
你所展示的代码为什么不足够? - John Percival Hackworth
这已经足够了,但我在尝试学习。使用单个语句可以在Python中完成惊人的事情,因此我认为列表也有一种pop_all()的方法。但我错了。 - Micke
如果您提出一个具体的问题会更好。虽然您先是问了一个问题,但您立即回答了它,让读者不知道您想要知道什么。 - John Percival Hackworth
显示剩余2条评论
3个回答

11

这就是具体操作步骤。我能想到的唯一重要的改进是原地清空列表:

def pop_all(l):
    r, l[:] = l[:], []
    return r
这个版本和你的版本之间的区别在于对被多个地方引用的列表的处理方式不同:
>>> a = [1, 2, 3]
>>> b = a
>>> pop_all(a)
[1, 2, 3]
>>> b
[]

4
实际上,为什么不直接
def pop_all(self):
    result, self._internal_list = self._internal_list, []
    return result

......如果您要重新分配self._internal_list,为什么不只返回旧的而不是复制它呢?


这是一个非常好的观点!这也意味着我不会复制我的原始文件。本应该想到这一点,但今天真的太长了。 - Micke

2

我刚刚有这个需求,决定使用列表推导式而不是像下面这样子类或子程序:

popped = [l.pop(0) for item in list(l)]

1
我也喜欢使用下划线来暗示它没有被使用,使用 range 来暗示我们并不是真正地循环遍历列表,而是调用 pop 函数 n 次。类似这样的写法:[l.pop(0) for _ in range(len(l))] - KyleMit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接