迭代栈(反向列表),有没有 isempty() 方法?
在Python中,遍历一个栈的最佳方法是什么呢?
a = [1,2,3,4]
while (len(a) > 0)
print a.pop()
# prints 4, 3, 2, 1 in sequence
我找不到一个叫isempty
的方法,每次检查长度似乎也不太对劲。
3 个回答
8
可以把列表当作一个布尔条件来用,只有在列表为空的时候,它的值才会是 False
:
>>> while a:
... print a.pop()
...
4
3
2
1
这样做不仅更简洁,而且效率更高(比如处理一个有10,000个元素的列表时,前者用时1.49毫秒,而后者用时1.9毫秒),因为它只需要检查列表的第一个元素是否存在:
$ 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
你还可以使用 reversed()
来获取一个反向迭代器:
>>> for n in reversed(a):
... print n
...
4
3
2
1
或者你可以用一行代码来实现:
print '\n'.join(map(str, reversed(a)))
需要注意的是,这样做并不会从列表中删除元素。如果需要删除,可以使用 del a[:]
来实现。
34
一般来说,容器的约定是:当容器里有东西的时候,它的值是“真”(True),而当容器是空的时,它的值是“假”(False)。所以你可以直接这样做:
while a:
print a.pop()