恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

Python进阶习题实战:字符串、列表、字典与递归核心解析

  • 首页
  • 资讯中心
  • /
  • Python进阶习题实战:字符串、列表、字典与递归核心解析

相关资讯

C语言高频面试题汇总:指针、内存对齐与手写代码全解析 2026/10/16 8:12:45
设计师狂喜:macOS Sequoia影像乐园一键生成透明背景沙滩日落 2026/10/16 8:12:45
PXE批量装机从原理到实战:DHCP+TFTP+HTTP+kickstart无人值守部署 2026/10/16 8:12:45

最新资讯

RoboMaster装甲板识别:OpenCV传统视觉实战指南
荣合科算HPC流体仿真集群计算平台助力中车研究团队高效完成1.8亿网格算例任务
两串电池主动均衡实战:PIC18F57K42+MP2642GR-Z硬件与调试
Android数据存储进化:从SharedPreferences到DataStore实战指南
Listwise排序模型详解:从NDCG优化到LambdaMART工业实践
霞鹜文楷 LXGW WenKai:免费商用的开源楷体字体,2 万余字装完即排

今日推荐

Java八种基本类型深度解析:从内存布局到实战选型
基础:常用快捷键——IDEA、VS Code、PyCharm 与 Linux 终端效率速查
解决ultraedit下verilog .v文件中文注释乱码:把编码配置改到TaoToken辅助排查

本周热门

UE动画修改实战:从资产编辑到重定向与蒙太奇驱动
统计随机数生成器攻击下的KLJN安全密钥交换协议Matlab仿真
政务API安全治理:资产测绘、低代码编排与行标对标实践

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

Python进阶习题实战:字符串、列表、字典与递归核心解析

发布时间:2026/10/16 8:17:45
Python进阶习题实战:字符串、列表、字典与递归核心解析 做了又一个多小时的课我把那套“进阶习题第一关二”完整刷了一遍。说实话刚开始看到题目列表的时候我还在想这不就是基础阶段的循环、函数换了个包装真正写起来才发现这一关的每一题都在逼你重新思考“这段代码可不可以写得更稳”。如果你已经学过Python基础语法但写题总是差点意思那这一关正好可以帮你把循环、字符串、列表、字典、递归这些知识点串成能直接解决问题的手艺。这套题目在某个闯关式刷题平台上属于“进阶起步”的位置前面接基础语法后面接算法思维。第一关二的题目量和单个题的代码量都不大但题型跨度很宽基本上把Python进阶入门阶段最常碰到的题型都覆盖了一遍。下面我会把这一关的设计逻辑、核心考点、实战思路以及折腾代码时踩过的坑全部整理出来希望能给正在刷题的人一点参考。1. 第一关二到底想考什么拆开题目才发现的三个层次1.1 从“能运行”到“要好”刷题要求的悄悄升级基础阶段的练习题大多只要求你实现功能比如输入两个数求和、遍历列表找最大值。第一关二的题目看起来也是这些名词但评分逻辑明显不一样了。平台会做性能极限测试数据规模比示例要大很多还会针对性检查边界条件。我记得有一道统计字符频率的题示例只给了十几个字符但测试用例里藏着几十万字符的输入如果你用的是三层嵌套循环超时几乎是必然的。这其实是这一关的第一个隐藏意图把你的思维从“能算出结果”推向“用合理的方式算出结果”。同样是遍历字符串用列表的count方法和用字典计数字典的复杂度完全不同同样是去重用in判断和用集合判断的执行时间可能差出几十倍。你不能再用“反正例子能过就行”的心态做题了。1.2 题型分布透露的知识重心我把这套题目按考法归了一下类主要集中在五个区域练习方向典型出题方式需要的核心能力字符串处理统计频率、反转、去除指定字符、子串判断熟练调用字符串方法理解不可变性列表与元组去重、排序、切片操作、嵌套列表处理掌握推导式、索引边界、排序的key参数自定义函数带默认参数、可变参数、返回值设计理解参数传递机制避免副作用递归入门递归反转、递归累加、斐波那契变体设计终止条件控制递归深度字典与集合按键取值、合并、计数、交集并集善用get、setdefault、Counter等工具这个分布说明一件事第一关二并不打算考你某一个孤立的知识点而是用一批小题目把“进阶语法工具包”反复练熟。你会发现许多题其实既可以用字符串方法做也可以用正则思路做还可以用字典做关键是能找到最不容易出错的做法。1.3 题面和细节里的“信息差”这套题里有一个很容易忽略的细节很多题面里都藏着典型的“坑”词。比如“不区分大小写统计”又比如“按频率降序如果频率相同则按字符升序”再比如“去除相邻重复元素”而不是“全部重复元素”。这些限定词如果你没读到位代码写出来结果就是反的。我后来养成了一个习惯做题之前先把题面里的限定词圈出来尤其是排序规则、去重规则、边界条件这三类。第一关二的很多题测试样例并不会完全展示这些细节但提交结果可靠不接受。所以花三十秒逐字读题比写完代码再回去猜要求划算得多。2. 落笔前要过一遍的五个核心知识点2.1 函数参数的“默认值陷阱”第一关二里有几道题要求你封装成函数这就会牵扯到参数设计。很多人在这里会踩默认参数的坑比如def add_item(item, container[]): container.append(item) return container这段代码连续调用两次容器里会积累上一次调用的结果。原因是默认参数是在函数定义时一次性创建的之后所有调用共享同一个列表对象。正确的写法是def add_item(item, containerNone): if container is None: container [] container.append(item) return container在刷题时你不一定要把每个函数都写成对外接口但你需要明白如果函数内部修改了可变对象而且这个对象来自外部调用方也会受影响。有一道题要求“返回处理后的新列表”如果你直接对原列表做sort然后return原列表测试方那边原来的数据也被改了就会莫名出错。2.2 列表推导式不是越炫越好进阶题里出现列表推导式的频率非常高。像“提取列表中长度大于3的字符串”“把嵌套列表展开一层”“生成某种规律的数列”用推导式都能写得很短。但我建议你写之前先算清楚可读性。比如result [x for x in data if x % 2 0]这种一行读完很清晰。但如果是下面这种嵌套两层还要加条件的result [y for x in matrix for y in x if y is not None]新手很容易写错循环顺序。我的建议是初版代码用普通循环写保证逻辑对通过了再考虑是否改写成推导式。这一关的判题系统只认结果和性能不认代码长度所以没必要拿可读性换炫技。2.3 字典操作决定你的代码有没有“灵气”字典是这一关的核心工具。如果你还停留在“先判断key在不在字典里不在就初始化在就更新”那代码会显得非常啰嗦而且容易漏掉分支。更稳的写法是count {} for ch in s: count[ch] count.get(ch, 0) 1一个get方法就把“键是否存在”的判断题给消掉了。如果是合并字典还可以用update如果是统计可哈希元素频率直接用collections.Counter更省事。第一关二里有一道题是“统计单词出现次数并按次数排序”我最开始写了一大串if判断结果不仅长还容易漏掉空格的处理。后来换成以空格分割再用Counter统计最后用sorted指定key排序代码量直接少了一大半而且边界情况也稳了。2.4 递归一定要先写终止条件递归题在进阶第一关里一般是压轴级别的存在。它不会太难但很考验你分解问题的能力。我见过不少同学一上来就写递归调用结果陷入死循环。其实递归只要抓住两件事就够了一是最小的问题怎么直接解决二是当前问题和更小规模问题之间的关系是什么。def reverse_str(s): if len(s) 1: return s return reverse_str(s[1:]) s[0]这个递归反转字符串的小例子就清晰体现了“终止条件递归关系”的结构。写递归题的时候我强烈建议你把终止条件写在函数第一行不要写在后面这样每次调用都会先检查边界降低写炸的概率。2.5 字符串处理的那些隐藏细节字符串方法很多但真正在第一关二反复用到的就那几个split、strip、lower、upper、replace、join。有个小细节容易忽略join是字符串的方法不是列表的方法写的时候是, .join(items)而不是items.join(, )。这个顺序搞反会直接报AttributeError。还有字符串的不可变性。很多人想通过str[i] x去替换字符结果报错。正确做法是先转成列表修改完再join回去。这类题很常见比如“把字符串中的某个字母全部替换成另一个字母”直接用replace就行但如果是“每隔两个字符插入一个符号”那就得走列表再拼接的路。3. 实战拆题四道典型题从读题到提交的完整过程3.1 字符串频率统计与排序先扫一遍再动手题目大概是这样的给定一个字符串输出每个字符的出现次数按出现次数从高到低排列如果次数相同按字符的ASCII码从小到大排列。输入可能包含大写字母、小写字母和数字。我拿到这道题后第一件事不是写代码而是把输入范围看了一眼。如果字符串很短任何写法都无所谓但题目没给明确长度那就得用字典一次遍历。from collections import Counter data input().strip() counter Counter(data) result sorted(counter.items(), keylambda x: (-x[1], x[0])) for ch, count in result: print(f{ch}:{count})这里有个很关键的点排序的key是一个元组第一项是次数取负表示降序第二项是字符本身表示升序。如果你写成keylambda x: x[1]那就是升序完全反了。我第一次提交就是因为漏看了“次数相同按字符升序”这个条件结果全军覆没。如果不用Counter用普通字典加get也可以但Counter的写法更短而且它返回的对象本身是字典子类可以直接丢给sorted。这个思路在第一关二里非常常用。3.2 列表去重且保持原顺序集合不是万能灵药另一道经典题是给定一个列表去掉重复元素但要求保持第一次出现的顺序。很多人会顺手写list(set(data))结果顺序全乱了。正确思路是遍历原列表用集合记录“已经出现过哪些元素”遇到没见过的就加入结果。seen set() result [] for x in data: if x not in seen: seen.add(x) result.append(x)如果你非要用推导式可以这样写但不建议seen set() result [x for x in data if not (x in seen or seen.add(x))]这个写法利用了or的短路特性把“加入集合”这一步藏在条件里代码短但初次阅读会很困惑。做题时我会先用第一种写法确保正确后再考虑压缩。这道题还引出一个重要心得看到“去重”不要条件反射地用集合先想清楚题目对顺序有没有要求。同样地看到“排序”也要问自己是稳定排序还是不稳定排序需不需要保留原顺序信息。第一关二的题目特别喜欢在这些细节上做文章。3.3 递归实现整数各位求和终止条件的艺术有一道题让你用递归实现“输入一个正整数返回各位数字之和”比如输入1234输出123410。这个题如果不用递归写个while循环非常简单但题目明确要求递归那你就要克制住用循环的冲动。def digit_sum(n): if n 10: return n return n % 10 digit_sum(n // 10)终止条件是n 10递归关系是把个位数和剩下的高位分开。我当时犯过的错误是忘记处理负数但题目说明是正整数所以不考虑也没关系。不过我在测试时还是习惯补一个对负数的判断以防平台偷偷塞边界用例。递归题最需要关注的是递归深度。Python默认递归限制是1000层左右这个题最多几千层就可能爆RecursionError。如果测试数据很大用递归并不安全这时可以用sys.setrecursionlimit临时调大但更稳妥的是改成迭代。我在第一关二里遇到这个题时测试数据并没有大到越界所以递归顺利通过但下一关的题目可能就不一样了。3.4 嵌套列表展开一层推导式还是循环还有一个常考题给一个列表里面有的元素是列表有的不是要求返回一个只展开一层的新列表。比如[1, [2, 3], 4, [5, [6]]]结果是[1, 2, 3, 4, 5, [6]]。result [] for item in data: if isinstance(item, list): result.extend(item) else: result.append(item)这里有个非常容易踩的坑不能用直接拼接列表元素因为整数和列表不能相加。正确做法是判断元素类型后用extend或append。还有一个细节是isinstance比type(item) list更稳因为如果未来出现list的子类isinstance一样能识别而type判断会漏掉。我用这道题想强调的是第一关二里的题目不会只考一个知识点而是让你在多个答案里选择最合适的数据结构和操作方式。你平时积累得越多考试做题时就能越快定位到最优解。4. 提交代码时反复踩到的坑一份避雷实录4.1 输入输出格式比想象中更严格这类刷题平台对输入输出的要求非常严格。字符串首尾有没有空格、每行末尾要不要换行、多个结果之间用什么分隔都影响到判题结果。第一关二里有好几道题题目给出了样例输出格式但没说“末尾不能有换行”或“中间不能有额外空行”。我建议你提交前先对比样例输出把print的输出和样例逐字对照包括空格。我自己吃过一次亏统计字符频率那道题我输出的是{字符}:{次数}但题目要求是每行字符:次数中间没有多余空格。我的代码里多写了一个空格结果前两次提交都判错。后来学乖了不管题目看起来多简单都在本地用样例测一遍然后把输出复制到一个txt里肉眼看一眼。4.2 可变对象粘来粘去导致的状态污染刷题过程中如果你在函数内部修改了传入的列表很可能影响后面的测试用例。平台一般对每个测试点会重新执行你的代码但如果你自己把多个题的功能写在同一个脚本里反复调用这就容易出问题。我的习惯是每个函数都保证“不修改入参”如果确实需要修改先copy一份再操作。def process(data): data data[:] # 后面的修改只作用于副本 data.sort() return data这个习惯在第一关二可能看不出明显优势但到了后期做复杂项目或多人协作时这是显著降低bug率的好习惯。4.3 递归深度不是无限大的前面提到过递归深度。第一关二里有些题虽然表面上是递归但数据规模一大默认递归深度就不够用。如果你看到RecursionError: maximum recursion depth exceeded不要急着改算法先确认数据范围。如果确实很大就改用循环。如果题目必须用递归就用sys.setrecursionlimit(1000000)顶一下但这只适合测试环境不适用生产场景。4.4 循环嵌套超时现场优化实例有一道题要求统计“列表中有多少对数字之和等于某个目标值”我一开始写了两层遍历数据量小的时候运行很快。但平台里塞了一个长度上万的大数组两层循环秒变超时。后来我改成用字典记录“已经出现过的数字及其个数”只遍历一遍count {} pairs 0 for x in data: target_num target - x pairs count.get(target_num, 0) count[x] count.get(x, 0) 1这个做法把时间从O(n^2)降到了O(n)。第一关二的题量没有大到非得用高级算法但你至少要能意识到“什么时候两层循环会出事”。判断标准很简单如果数据量可能超过一万就要留个心眼考虑哈希表优化。4.5 边界值0、空串、负数、单个元素边界值测试是我刷这套题最大的收获。很多题正常逻辑没问题一旦输入是空字符串、空列表、0或者负数就崩了。比如“反转字符串”的递归写法如果输入是空串s[1:]会越界吗不会因为空串[1:]还是空串但如果没有终止条件就会无限递归。还有“求列表最大值”的题如果列表为空题目可能约定返回None也可能是返回0这就需要仔细读题。我的标准做法是把边界值清单列出来提交前挨个测空输入、最小输入、最大输入、重复输入、已经排好序的输入、完全逆序的输入。第一关二的题量虽然不大但这个习惯一旦养成后面刷动态规划和图论时会帮你省下无数时间。5. 刷完第一关二之后怎样继续“长肌肉”5.1 每个习题都值得二次重构第一次提交通过只是一道题的起点。我会把通过的代码复制到一个“练习存档”文件夹里过两天再拿出来重写一遍不参考原来代码。这个过程能暴露出很多东西原来你以为记住的知识点过两天就忘了大半。重写的时候会自然的思考“能不能用字典省掉一次遍历”“能不能用生成器减少内存占用”“能不能把重复代码抽成一个函数”。第一关二的题目量适中非常适合做这种重构训练。我还会把每道题的解题思路压缩成一两句写在代码注释里。比如# 思路用字典记录已出现的数字把O(n^2)降为O(n)几周后再回头翻比看一本厚厚的学习笔记更管用因为那是你用自己的语言总结出来的。5.2 把知识点串成“工具箱”第一关二的题目虽然小但积少成多就是一个Python工具箱。字符串题练的是split和join列表题练的是推导式和切片字典题练的是get和setdefault递归题练的是终止条件。等你把这些都练熟了后面遇到“读取文件并统计词频”“解析嵌套JSON”“写一个简单的爬虫“之类的小项目你会发现很多代码是可以直接套用的。我在刷完这关之后明显感觉自己对Python标准库的用法熟练了很多。比如collections模块的Counter和defaultdict之前只是听说过用完Counter之后才真正理解它为什么能节省那么多代码。这种从“知道”到“会用”的跨越只有通过刷题才能实现。5.3 关于下一关的一点个人建议这一关通过后可以先别急着冲向更难的内容回头把错误里比较典型的几道题再手敲一遍。我发现很多人的问题是“一看到熟悉题就直接跳”但真正解题能力提升往往发生在你做一道之前觉得很难、现在能独立写出来的题的时候。第一关二就是这样一个恰到好处的难度阶段既不会让你卡到想放弃又不至于让你在舒适区躺平。我当时给自己定了一个小目标每天只精做两道题但这道题要写出至少两种思路并跑通所有边界用例。看上去进度很慢但一个星期后回头我对字符串、列表、字典的组合运用已经熟练了不少写小脚本的速度也快了很多。刷题数量当然重要但比数量更重要的是每一题你真正消化了多少。最后再分享一个实操细节遇到“看不出考点”的题试着把它和你最近刚学过的知识点强行挂钩哪怕标错也没关系。练习阶段不怕猜错思路就怕对着题目发呆。我在第一关二里发现一个很有意思的现象很多看似是“数学题”的题目其实都能通过字典、集合这类基础数据结构优雅地解决。这种看到题目背后数据结构的直觉比背几个函数名重要得多。希望刷这套题的朋友都能在通关的时候带走手感而不只是通关记录。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号