Python列表推导式变量操作:高效提取字符串新增字符位置
嘿,这个场景我之前处理过!直接用zip确实会踩坑——因为它只会按两个字符串中较短的长度配对,不仅会忽略s2末尾的新增字符,中间出现新增字符时还会导致后续的字符索引完全错位,根本没法正确找到差异位置。
用双指针思路结合列表推导式就能高效解决,而且代码还挺简洁的。核心是要在推导式里维护一个追踪s1遍历进度的指针,这里可以用可变对象(比如一个单元素列表)来保存指针状态,再配合海象运算符(Python 3.8+支持)来更新指针,完美适配列表推导式的语法:
s1 = "abcdefghijklmnopq" s2 = "abscdefghijklmnopq" # 用列表保存指针状态,因为列表是可变对象,推导式里修改会保留 i = [0] # 列表推导式筛选出s2中新增字符的索引 diffs = [ j for j, c2 in enumerate(s2) if not (i[0] < len(s1) and c2 == s1[i[0]] and (i[0] := i[0] + 1)) ] print(diffs) # 输出: [2],对应s2里的's'
逻辑拆解:
i = [0]:用列表存指针是因为普通变量在列表推导式里是局部的,修改不会延续到下一次迭代,而可变对象的元素修改会保留状态- 遍历
s2的每个字符和索引j:- 当
i[0]还没遍历完s1,且当前字符和s1指针位置的字符匹配时,用海象运算符:=把i[0]加1,这个条件整体返回True,前面的not会把这个j排除出结果 - 不满足匹配条件时,这个
j就是s2新增字符的位置,会被加入diffs列表
- 当
如果你的Python版本低于3.8,没法用海象运算符,也可以用生成器函数配合列表推导式,可读性同样不错:
def find_extra_positions(s1, s2): i = 0 len_s1 = len(s1) for j, c2 in enumerate(s2): if i < len_s1 and c2 == s1[i]: i += 1 else: yield j s1 = "abcdefghijklmnopq" s2 = "abscdefghijklmnopq" diffs = list(find_extra_positions(s1, s2)) print(diffs) # 输出: [2]
这种方式效率和普通循环几乎一致,但用列表推导式(或生成器转列表)的写法比纯循环更简洁,完全符合你的需求~
内容的提问来源于stack exchange,提问作者Zarrie
相关产品推荐
相关产品推荐

