当前位置:首页 > 百科 > python查找 正文

python查找

来源:烟消火灭网   作者:探索   时间:2026-10-17 05:53:15

我见过太多人用Python查东西,查找第一反应就是查找写个for循环。有个朋友处理一份两万行的查找日志,想找出所有包含“timeout”的查找行,他写了双层嵌套遍历,查找跑了一分多钟还没出结果。查找我让他把代码发过来,查找改了一行——用列表推导式加in判断,查找三秒完事。查找这不是查找炫技,是查找Python本身的设计逻辑:查找这件事,它给了你一堆现成工具,查找你非要用蛮力,查找那就只能自己扛着。查找

最基础的查找查找是判断“有没有”。in运算符干这个事干净利落。字符串里找子串,列表里找元素,字典里找键,一行搞定。有人纠结in背后是不是也遍历了,当然遍历了,但它是C语言层面的遍历,比你手写Python循环快一个数量级。这就像你翻书找一句话,你是逐字扫视还是直接翻到目录?in就是那个目录。

如果需要知道“在哪”,那就得用find、index这类方法。字符串的find返回第一个匹配的索引,找不到返回-1。index找不到直接抛异常。我偏向用find,因为异常处理写起来啰嗦,而且大部分场景下找不到就是正常逻辑分支,不是错误。列表也有index,但字典没有——字典的“查找”本质上是通过哈希直接定位,O(1)复杂度,压根不需要“找”这个动作。

说到字典,这是Python里查找效率最高的结构。键值对存储,哈希表实现,平均情况下一次命中。我做过一个测试:一百万个键的字典,查一个不存在的键,耗时不到0.05微秒。换成列表遍历,平均要扫五十万次。差距就是这么赤裸。所以当你需要频繁查找时,先把数据塞进字典或集合,这是最划算的预处理。

集合set更纯粹,只存键不存值,专门用来做成员判断。两个列表找交集,新手写双重循环,老手直接set(a) & set(b)。一行代码,底层是哈希运算,速度差几十倍。我处理用户ID去重时,从来都是先转集合再操作,内存多占一点,时间省一大截。

正则表达式是另一条路。当查找条件不是固定字符串,而是某种模式——比如所有邮箱地址、所有日期格式——re模块就是唯一选择。re.findall返回所有匹配,re.search找第一个,re.finditer返回迭代器省内存。我见过有人用split加strip硬解HTML里的链接,写了三十行,还漏了带引号的情况。换成re.findall(r'href="(.*?)"', html),一行,准确率还高。

文件查找也值得说一句。glob模块用通配符匹配文件名,pathlib的rglob可以递归查找。以前用os.walk写递归,现在Path('.').rglob('*.py')直接返回生成器,干净得多。我整理项目时常用这个找所有测试文件,比在IDE里点来点去快。

最后提一个容易踩的坑:查找时的类型匹配。字典的键是1和True,在Python里哈希值相同,会互相覆盖。列表里1和1.0相等,in判断会返回True。这些细节不留意,查找结果就可能出乎意料。我调试过一个bug,用户ID从JSON读进来是字符串,数据库里是整数,in判断永远为假,查了半天才发现是类型问题。

Python查找的核心就一句话:用对数据结构,别手写循环。字典和集合是哈希查找,列表和字符串是线性查找,正则负责模式匹配,glob和pathlib管文件路径。选对了工具,代码短,跑得快,bug还少。

标签:

责任编辑:探索