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/