在python中迭代堆栈的具体方法是什么。使用for循环就像迭代列表一样是最好的做法吗?
答案 0 :(得分:11)
如果您的堆栈可能会增长到很大的比例,您绝对不应该使用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。如果你想要FIFO或for item in stack
用于FILO,你也可以用for item in reversed(stack)
迭代它,这将生成一个内存有效的反向迭代器。
答案 1 :(得分:3)
在Python中,与其他编程不同。像C ++(STL)这样的语言,我们没有预定义的数据结构Stack
,我们只有一个常规的List
。
所以,如果你想把你的“Stack”作为常规List迭代,你可以简单地做出类似的事情:
for item in reversed(my_list): # to preserve LIFO
# do something with item
# ...
现在,如果您希望List表现为堆栈(LIFO:Last In First Out),您可以使用预定义列表函数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-lists-as-stacks
中的更多相关信息答案 2 :(得分:0)
正如其他人所说,python本身并没有真正的内置堆栈数据类型 - 但你可以使用列表来模拟一个。
当使用列表作为堆栈时,您可以使用append()作为push来模拟倒数第一个行为,并将pop()设置为pop,就像julio.alegria描述的那样。
如果要在for循环中使用该列表,但仍然使其以FILO方式运行,则可以使用此切片语法反转元素的顺序:[::-1]
。
示例:
for element in stack[::-1]:
print element
如果您正在使用实现堆栈的自定义类,只要它定义了__iter__()
和next()
方法,您就可以在列表推导,循环或其他方面使用它
通过这种方式,您可以实现一个自定义迭代器,在迭代它时删除项目,就像它应该使用适当的堆栈一样。
示例:
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