You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:54:04