在python中迭代堆栈的具体方法是什么。使用for循环的最佳实践是否与迭代列表一样?
如果您的堆栈可能会增长到很大的比例,那么您绝对不应该使用List
或自定义堆栈类。Raymond Hettinger已经为您完成了这项工作,并撰写了精彩的collections.deque
。deque
是一种类似列表的数据结构,支持从两端进行恒定时间的追加和弹出。
>>> from collections import deque
>>>
>>> stack = deque()
>>> stack.append(1)
>>> stack.append(2)
>>> stack.append(3)
>>> print stack
deque([1,2,3])
通过适当地使用deque.pop()
和deque.popleft()
,可以分别获得FILO和FIFO。如果想要FILO的FIFO或for item in reversed(stack)
,也可以使用for item in stack
对其进行迭代,这将生成一个内存高效的反向迭代器。
在Python中,与其他程序不同。语言像C++(STL(一样,我们没有预定义的数据结构Stack
,我们只有一个规则的List
。
因此,如果你想将你的"堆栈"迭代为一个常规列表,你只需要制作一些类似的东西:
for item in reversed(my_list): # to preserve LIFO
# do something with item
# ...
现在,如果您希望您的列表表现为堆栈(LIFO:后进先出(,您可以使用预定义的列表函数append
和pop
:
>>> stack = [1, 2]
>>> stack.append(3)
>>> stack.append(4)
>>> stack
[1, 2, 3, 4]
>>> stack.pop()
4
>>> stack
[1, 2, 3]
有关此的详细信息,请参阅http://docs.python.org/tutorial/datastructures.html#using-将列为堆栈
正如其他人所说,python本身并没有内置的堆栈数据类型,但您可以使用列表来模拟它。
当使用列表作为堆栈时,您可以用append((作为push,pop((作为pop来建模先进先出的行为,正如julio.alegria所描述的那样。
如果您想在for循环中使用该列表,但仍使其以FILO方式运行,则可以使用以下切片语法反转元素的顺序:[::-1]
。
示例:
for element in stack[::-1]:
print element
如果您使用的是实现堆栈的自定义类,只要它定义了__iter__()
和next()
方法,就可以在列表理解、for循环或其他任何方法中使用它。
通过这种方式,您可以实现一个自定义迭代器,该迭代器在对项进行迭代时删除项,就像它应该使用适当的堆栈一样。
示例:
class Stack:
def __init__(self):
self.data = []
def push(self,n):
self.data.append(n)
def pop(self):
return self.data.pop()
def __iter__(self):
return self
def next(self):
if len(self.data)>0:
return self.pop()
else:
raise StopIteration
filo = Stack()
filo.push(1)
filo.push(2)
filo.push(3)
for i in filo:
print i