Python中调用print()函数时FreqStack类的__str__()方法未生效的问题排查
问题根源分析
你现在遇到的核心问题是:你打印的是pop()方法的返回值,而不是FreqStack类的实例本身,所以完全没触发你定义的__str__方法。
具体来说,你的pop()方法返回的是修改后的self.stack(一个原生列表)或者空栈提示字符串。当你执行print(freq_stack.pop())时,Python会直接输出列表默认的字符串格式(方括号包裹的形式),和你写的__str__半毛钱关系都没有~
解决方案
我们分两步来修正:
1. 修正pop()方法的语义和返回值
栈的pop()方法通常应该返回被移除的单个元素,而不是整个栈。同时你的原逻辑会一次性移除所有最高频率的元素,这也不符合“每次移除一个最高频元素”的常规设计。调整后的代码如下:
class FreqStack(): def __init__(self, lst:list = None): if lst is None: self.stack = [] else: self.stack = lst[::-1] def push(self, el: int): self.stack.insert(0, el) return self.stack def pop(self): if not self.stack: return 'Stack is empty!' # 统计每个元素的出现频率 freq_map = {} for el in self.stack: freq_map[el] = freq_map.get(el, 0) + 1 # 找到最高频率值 max_freq = max(freq_map.values()) # 从栈顶(列表开头)找第一个出现的最高频元素(符合栈“后进先出”的优先级) for idx, el in enumerate(self.stack): if freq_map[el] == max_freq: removed_el = self.stack.pop(idx) return removed_el # 返回被移除的元素,而非整个栈 def __str__(self): return '\n|\n'.join(str(el) for el in self.stack)
2. 修改测试代码,打印类实例而非pop()返回值
如果你想查看每次pop后的栈状态,应该在执行pop()后打印FreqStack实例本身,这样才会触发你定义的__str__方法:
lst = [1, 1, 1, 5, 5, 5, 3, 3, 3, 7, 7, 9] freq_stack = FreqStack(lst) for i in range(6): removed_element = freq_stack.pop() print(f"本次移除元素: {removed_element}") print("当前栈状态:") print(freq_stack) print("-------------------")
运行后你就能看到自定义的栈格式输出了~
内容的提问来源于stack exchange,提问作者ArtPus
相关产品推荐
相关产品推荐

