将元素弹出堆栈的Pythonic方式(collections.deque)

标签 python python-3.x deque

TL;DR:请参阅底部的代码。

我正在实现 Reverse Polish Notation calculator在Python中,使用collections.deque堆栈实现。

由于我还要处理具有多个参数的函数的情况,因此我使用了放置在实际参数之前的分隔符。例如,假设以下表达式作为输入:max(2, 3, 4)Shunting Yard算法生成以下迭代:['|', '2', '3', '4', 'max']

当我迭代它时,分隔符和数字被插入堆栈;如果遇到函数,则直到分隔符之前的所有元素都会从堆栈中“弹出”并附加到列表中。

有没有一种更Pythonic的方法来从堆栈末尾弹出元素到一定的条件? 到目前为止我的代码:

args = []
while op_stack[-1] != FUNC_ARGS_SEPARATOR:
    args.append(op_stack.pop())

最佳答案

你所拥有的一切都很好;没有合理的方法可以使用迭代器协议(protocol)来完成此任务(这通常是您清理此类内容的方式)。

理论上,如果您翻转了 op_stack 的顺序(因此顶部在左侧,而不是右侧),您也许可以使用 .index找到分隔符,然后做一个批量切片和args.extend,然后做一个批量del切片,但这几乎不值得麻烦(特别是当分隔符可能是发现得相对较快)。

关于将元素弹出堆栈的Pythonic方式(collections.deque),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50656924/

相关文章:

python - 以自动宽度打印到 CSV 文件

python - 从 Instagram 中提取关注者数量

python - 通过为 Azure 云存储编写的自定义存储设置 Django Imagefield 模型属性的 url

python - 运算符结果的 Numpy 总和,无需分配不必要的数组

python - 如何使用 2 个拆分参数拆分字符串?

Python:调用另一个类的方法,指定为函数的参数

python - selenium.webdriver.firefox.options - 它是关于什么的?

C++ deque 的迭代器在 push_front() 之后失效

python - 在 collections.deque 中使用切片表示法

c++ - std::deque 错误?