You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 01:52:45