
python 函数返回字典时,其数据结构本身是紧凑的,但交互式环境(如 ipython/jupyter)会自动美化打印(pretty-print),导致键值对分行显示;实际返回值完全符合预期,无需修改逻辑。
在编写字符串子串位置查找函数时,你已正确实现了核心逻辑:遍历所有长度为 k 的子串,用 str.find() 循环收集每个子串在原字符串 s 中的所有起始索引,并以子串为键、索引列表为值构建字典。该函数 find_substring_locations('TTAATTAGGGGCGC', 2) 的实际返回值是一个标准 dict 对象,其内容与期望完全一致:
{'TT': [0, 4], 'TA': [1, 5], 'AA': [2], 'AT': [3], 'AG': [6], 'GG': [7, 8, 9], 'GC': [10, 12], 'CG': [11]}你观察到的“每行一个键值对”的输出,并非函数返回的结果格式问题,而是当前运行环境(极可能是 IPython、Jupyter Notebook 或某些 IDE 的交互式控制台)对字典对象的默认可视化行为。这类环境为提升可读性,会自动启用 pprint(pretty print)机制,将嵌套或较长的字典/列表格式化为多行缩进形式。
✅ 验证方式(推荐):
result = find_substring_locations('TTAATTAGGGGCGC', 2)
print(result) # 使用 print() 强制普通字符串输出 → 通常显示为单行
print(type(result)) # 确认类型为
print(len(result)) # 输出 8,说明字典含 8 个键值对 ⚠️ 注意事项:
立即学习“Python免费学习笔记(深入)”;
- 不要尝试用 sorted() 或 json.dumps() 等方式“修复”显示问题——这既不必要,还可能破坏字典原有插入顺序(Python 3.7+ 保证插入序,但排序会改变逻辑顺序);
- 若需在日志或文件中保存紧凑格式,使用 print(str(result)) 或 json.dumps(result)(注意:json.dumps 要求键为字符串且值可序列化,此处适用);
- 该函数时间复杂度为 O(n²k),对超长字符串可进一步优化(如用滑动窗口 + 字典计数替代重复 find),但当前实现语义清晰、正确可靠。
总结:你的代码逻辑无误,输出格式差异纯属环境渲染所致。专注数据正确性而非显示样式,是 Python 开发中的重要认知习惯。










