迭代堆栈(反向列表),是否有isempty()方法?

Jas*_*n S 8 python iteration stack

在Python中迭代堆栈的最佳方法是什么?

a = [1,2,3,4]
while (len(a) > 0)
  print a.pop()

# prints 4, 3, 2, 1 in sequence
Run Code Online (Sandbox Code Playgroud)

我无法找到一种isempty方法,并且每次检查长度似乎都是错误的.

Ray*_*Ray 27

容器的通常惯例是它们是真的而不是空的而当空的时候是假的,所以你可以这样做:

while a:
    print a.pop()
Run Code Online (Sandbox Code Playgroud)


mar*_*cog 6

将列表用作布尔条件,False仅当列表为空时才计算:

>>> while a:
...     print a.pop()
... 
4
3
2
1
Run Code Online (Sandbox Code Playgroud)

这不仅更简洁,而且效率更高(1.49ms对10,000列表的1.9ms),因为它只需要检查是否有第一个元素:

$ python -mtimeit -c 'a=range(10000)
while len(a):
  a.pop()'
10000 loops, best of 3: 1.9 msec per loop
$ python -mtimeit -c 'a=range(10000)
while a:     
  a.pop()'
1000 loops, best of 3: 1.49 msec per loop
Run Code Online (Sandbox Code Playgroud)

您还可以使用reversed()获取反向迭代器:

>>> for n in reversed(a):
...     print n
... 
4
3
2
1
Run Code Online (Sandbox Code Playgroud)

或者在一行中:

print '\n'.join(map(str, reversed(a)))
Run Code Online (Sandbox Code Playgroud)

请注意,这不会从列表中删除元素.如有必要,您可以实现这一目标del a[:].