Python堆栈迭代,最佳实践



在python中迭代堆栈的具体方法是什么。使用for循环的最佳实践是否与迭代列表一样?

如果您的堆栈可能会增长到很大的比例,那么您绝对不应该使用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。如果想要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:后进先出(,您可以使用预定义的列表函数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-将列为堆栈

正如其他人所说,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

相关内容

最新更新