Python Stack Iteration,最佳实践

时间:2011-11-09 04:37:24

标签: python

在python中迭代堆栈的具体方法是什么。使用for循环就像迭代列表一样是最好的做法吗?

3 个答案:

答案 0 :(得分:11)

如果您的堆栈可能会增长到很大的比例,您绝对不应该使用List或自定义堆栈类。 Raymond Hettinger已经为你完成了这项工作并编写了精彩的collections.dequedeque是一个类似于数据结构的列表,支持从两端开始的常量时间追加和弹出。

>>> 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),您可以使用预定义列表函数appendpop

>>> 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