请求解析Python中实现公共前缀的enumerate代码执行流程
字符串列表公共前缀代码执行流程详解
先看原代码:
strings = ["apple", "app", "ape"] common = next((i for i,(p,*r) in enumerate(zip(*strings)) if any(p!=c for c in r)),0) print(strings[0][:common]) # ap
下面一步步拆解执行逻辑:
1. zip(*strings):按位置聚合字符
*strings是把列表里的三个字符串解包成zip的独立参数,相当于zip("apple", "app", "ape")。zip会逐个位置取所有字符串的对应字符,直到最短的字符串耗尽:
- 第0位:
('a', 'a', 'a')(三个字符串的第一个字符) - 第1位:
('p', 'p', 'p')(三个字符串的第二个字符) - 第2位:
('p', 'p', 'e')(三个字符串的第三个字符,此时"app"和"ape"已无更多字符,zip停止)
2. enumerate(zip(*strings)):给字符组加索引
enumerate会给zip生成的每个字符元组添加上对应的位置索引,得到:
(0, ('a', 'a', 'a'))(1, ('p', 'p', 'p'))(2, ('p', 'p', 'e'))
3. i,(p,*r):解包索引和字符组
这一步是对enumerate的每个输出做解构:
i:拿到当前的位置索引(0、1、2)(p,*r):把字符元组拆成第一个字符p,剩下的字符打包成列表r:- 索引0:
p='a',r=['a','a'] - 索引1:
p='p',r=['p','p'] - 索引2:
p='p',r=['p','e']
- 索引0:
4. 生成器表达式+any():找第一个不匹配的位置
生成器会遍历每个索引和字符组,判断条件any(p!=c for c in r):
- 这个条件是检查当前位置的字符是否在所有字符串中都一致:只要
r里有一个字符和p不一样,any()就返回True - 索引0:所有字符都是'a',
any()返回False,跳过 - 索引1:所有字符都是'p',
any()返回False,跳过 - 索引2:
r里有'e'和p不一样,any()返回True,此时把索引2传入生成器
5. next():获取第一个不匹配的索引
next()会取生成器的第一个结果(也就是2),如果所有位置的字符都完全一致(比如所有字符串相同),生成器没有输出,就会用默认值0。
6. 截取公共前缀
strings[0][:common]取第一个字符串的前common个字符,也就是前2位,得到ap。
内容的提问来源于stack exchange,提问作者Aditya Mishra
相关产品推荐
相关产品推荐

