Python Stack Iteration,最佳实践

co2*_*f2e 4 python

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

End*_*age 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])
Run Code Online (Sandbox Code Playgroud)

然后适当地使用deque.pop(),deque.popleft()你可以分别实现FILO和FIFO.for item in stack如果需要FIFO或for item in reversed(stack)FILO,也可以迭代它,这将生成一个内存高效的反向迭代器.

  • 在一个更美好的世界中,这个答案将是公认的答案. (3认同)
  • 为什么不使用`List`,你能解释一下吗? (2认同)

Con*_*ean 2

正如其他人所说,Python 本身并没有真正内置的堆栈数据类型,但您可以使用列表来模拟它。

当使用列表作为堆栈时,您可以使用append()作为push和pop()作为pop来建模先进后出行为,如julio.alegria所描述的。

如果您想在 for 循环中使用该列表,但仍使其以 FILO 方式运行,您可以使用以下切片语法反转元素的顺序:[::-1]

例子:

for element in stack[::-1]:
    print element
Run Code Online (Sandbox Code Playgroud)

如果您使用实现堆栈的自定义类,只要它__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
Run Code Online (Sandbox Code Playgroud)