Python字符串解析:按元组字典规则向列表加内容的问题求助
字节码指令匹配问题修复方案
我来帮你梳理下问题核心,然后给出针对性的修复方案:
你的场景与需求
你有一段字节码字符串和对应的操作码映射字典:
data = '604452601061112210' NewDict = {'60': ('PUSH1', 1), '61': ('PUSH2', 2), '52' : ('MSTORE', 0 ), '12' : ('ADD', 0)}
你希望扫描字符串匹配字典中的操作码,将指令及后续对应字节加入列表,预期输出是:
['PUSH1 44', 'MSTORE', 'PUSH1 10', 'PUSH2 1122', 'ADD']
但实际得到的错误输出是:
['PUSH1 44', 'MSTORE ', 'PUSH1 10', 'PUSH2 2210']
原代码的问题分析
你的代码存在几个关键逻辑错误:
- 遍历字典的方式错误:
for item in NewDict会遍历所有字典键,当匹配到一个操作码后,循环还会执行其他键的else分支,错误地增加i的值,导致指针混乱。 - 指针更新顺序错误:你先增加
i再提取后续字节,这样会跳过操作码后的正确字节,比如PUSH2本来应该取1122,结果因为先移动了指针,取到了后面的2210。 - 无后续字节的指令处理不当:对于
MSTORE、ADD这类不需要后续字节的指令,你依然拼接了空字符串,导致出现多余空格。
修正后的代码
data = '604452601061112210' NewDict = {'60': ('PUSH1', 1), '61': ('PUSH2', 2), '52' : ('MSTORE', 0 ), '12' : ('ADD', 0)} i = 0 L = [] while i < len(data): op = data[i:i+2] # 直接匹配当前操作码是否在字典中 if op in NewDict: instr, num_bytes = NewDict[op] # 先跳过当前操作码本身(2个字符) i += 2 if num_bytes > 0: # 提取后续对应长度的字节 bytes_part = data[i:i+num_bytes*2] L.append(f"{instr} {bytes_part}") # 跳过已提取的字节 i += num_bytes*2 else: # 无后续字节,直接添加指令名 L.append(instr) else: # 遇到未知操作码时,跳过该字节(可根据需求调整处理逻辑) i += 2 print(L)
代码说明
- 直接用
op in NewDict精准匹配当前操作码,避免无效遍历 - 指针更新逻辑更清晰:先跳过操作码,再提取后续字节(如果有),最后跳过字节部分
- 针对
num_bytes=0的指令单独处理,不会出现多余空格 - 测试后输出完全符合你的预期:
['PUSH1 44', 'MSTORE', 'PUSH1 10', 'PUSH2 1122', 'ADD']
内容的提问来源于stack exchange,提问作者kieron
相关产品推荐
相关产品推荐

