Python3.9 如何用更Pythonic的方式提取两个等长十六进制字符串的差异段
Pythonic改写十六进制字符串差异提取代码实现
问题背景
现有两个长度相等且为偶数的十六进制字符串a和b,示例如下:
a = "3030104AF43B000A3F1D200619D09FE00403031324354650004FFFFF" b = "3030104BE3B000C3DF1D200617183BA00403030335F5B6F0004FFFFF"
两个字符串格式一致,差异部分总是连续出现,其余位置字符相同,比如前6位303010完全一致,后续6位4AF43B和4BE3B0存在差异,之后又有两位00一致,该规律贯穿整个字符串。
现有可运行的原始实现如下:
seed = "3030104AF43B000A3F1D200619D09FE00403031324354650004FFFFF" seed2 = "3030104BE3B000C3DF1D200617183BA00403030335F5B6F0004FFFFF" seed = seed.rstrip("FF") seed2 = seed2.rstrip("FF") differences_list1 = [] differences_list2 = [] sequence1 = "" sequence2 = "" for pair in range(int(len(seed) / 2)): data_pair1 = seed[pair * 2:(pair * 2) + 2] data_pair2 = seed2[pair * 2:(pair * 2) + 2] if data_pair1 == data_pair2: if sequence1 == "" and sequence2 == "": continue differences_list1.append(sequence1) differences_list2.append(sequence2) sequence1 = "" sequence2 = "" continue sequence1 = sequence1 + data_pair1 sequence2 = sequence2 + data_pair2 print(str(differences_list1)) print(str(differences_list2))
代码输出符合预期:
['4AF43B', '0A3F', '19D09FE0', '1324354650'] ['4BE3B0', 'C3DF', '17183BA0', '0335F5B6F0']
需求是基于Python 3.9版本,将上述代码改写为更符合Pythonic风格的实现。
实现方案
seed = "3030104AF43B000A3F1D200619D09FE00403031324354650004FFFFF" seed2 = "3030104BE3B000C3DF1D200617183BA00403030335F5B6F0004FFFFF" # 去除尾部FF s1, s2 = seed.rstrip('FF'), seed2.rstrip('FF') # 按字节(每两位)拆分两个字符串,用zip配对 byte_pairs = zip( (s1[i:i+2] for i in range(0, len(s1), 2)), (s2[i:i+2] for i in range(0, len(s2), 2)) ) diff1, diff2 = [], [] current1 = current2 = "" for b1, b2 in byte_pairs: if b1 == b2: if current1: # 走到相同字节且当前有累积的差异片段,存入结果 diff1.append(current1) diff2.append(current2) current1 = current2 = "" continue # 差异字节追加到当前累积片段 current1 += b1 current2 += b2 # 处理字符串末尾可能存在的未收尾的差异片段 if current1: diff1.append(current1) diff2.append(current2) print(diff1) print(diff2)
优化点说明
- 用步长为2的切片生成器直接拆分字节对,替代手动计算索引的写法,逻辑更直观
- 用
zip同时遍历两个字符串的字节对,避免重复索引取值 - 简化空值判断逻辑,利用Python空字符串布尔值为
False的特性简化条件判断 - 补充了原始代码遗漏的末尾差异片段收尾逻辑:如果字符串结尾正好是差异段,原始代码不会把最后一段差异存入列表,优化版补上了这个边界处理
- 变量命名更简洁规范,减少冗余变量
运行上述代码输出和原始代码完全一致,且覆盖了更多边界场景。
内容的提问来源于stack exchange,提问作者Roh_G
相关产品推荐
相关产品推荐

