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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:46:58