请求修复Python的get_triples_dict函数以实现三元组统计功能
修复
get_triples_dict()函数的方案 我帮你排查了原代码里的问题,主要有两处导致输出不正确:
- 遍历字典键的时候,直接操作
dict.keys()视图对象并同时修改字典,会引发遍历异常,而且你访问键的方式triples_dict[keys]是错误的(keys是键的集合,不是单个键) - 在循环删除键时,手动调整索引
i = i -1的方式在Python的for循环里并不生效,因为循环的迭代器是预先生成的
下面是修复后的完整代码,我保留了你的核心逻辑,只修正了错误的部分:
def get_triples_dict(text): triples_dict = {} mod_text = "" # 处理文本:仅保留字母并转为小写 for char in text: if char.isalpha(): mod_text += char.lower() # 长度不足3直接返回空字典 if len(mod_text) < 3: return triples_dict # 统计所有三元组的出现次数 for i in range(len(mod_text) - 2): triple = mod_text[i:i+3] triples_dict[triple] = triples_dict.get(triple, 0) + 1 # 过滤掉出现次数<=1的键值对,用字典推导式更简洁安全 triples_dict = {k: v for k, v in triples_dict.items() if v > 1} return triples_dict def test_get_triples_dict(): print("1.") print_dict_in_key_order(get_triples_dict('super, duper')) print("\n2.") print_dict_in_key_order(get_triples_dict("ABC ABC ABC")) print("\n3.") print_dict_in_key_order(get_triples_dict("Sometimes the smallest things make more room in your heart")) print("\n4.") print_dict_in_key_order(get_triples_dict("My favourite painting is the painting i did of my dog in that painting in my den")) # 补充测试所需的辅助函数(原代码未提供) def print_dict_in_key_order(d): for key in sorted(d.keys()): print(f"{key}: {d[key]}")
关键修改点说明:
- 把遍历文本的方式从
range(len(text))改成直接遍历字符for char in text,代码更简洁易读 - 统计三元组时用
dict.get()方法,避免了繁琐的if-else判断,一行搞定计数逻辑 - 最后过滤字典用字典推导式,这是Python里处理这类过滤最安全高效的方式,彻底避免了遍历字典时修改字典的风险
- 提前判断文本长度不足3的情况,直接返回空字典,逻辑更清晰
这样修改后,你的测试用例应该能得到预期的输出了。
内容的提问来源于stack exchange,提问作者Lucky18
相关产品推荐
相关产品推荐

