在Python中解析令牌列表

2024-06-02 07:48:27 发布

您现在位置:Python中文网/ 问答频道 /正文

目标:我有一个令牌列表。每当有一段标记被方括号包围时,比如{t1,t2,etc.},我就需要把它变成一个新的子列表。下面是我期望的结果的一个例子。在


解析:['(fact)'、'dup'、'length'、'/n'、'exch'、'def'、'/fact'、'{'、'0'、'dict'、'begin'、'/n'、'def'、'n'、'2'、'lt'、'{'、'1'、'sub'、'n'、'mul'、'}'、'ifelse'、'end'、'}'、'def'、'n'、'fact'、'stack')

退货: ['(fact)','dup','length','/n','exch','def','/fact',[0,'dict','begin','/n','exch','def','n',2,'lt',[1],'n',1,'sub','fact','n',mul'],'ifelse','end'],'def','n','fact',stack']


以下是我目前为止的代码:

def parse1(L):
    newL = []
    for x in L:
        if x == '}':
            return newL
        elif x == '{': 
            newL.append(parse1(L[1:]))
        else:
            newL.append(x)
    return newL

它的工作原理是,每当{发生时,我会再次将列表的其余部分隐式地传递到函数中,基本情况是当}发生时。这是正常的,但是一旦它退出递归并创建一个子列表,它所遍历的元素“x”就没有经过这个部分。例如,如果我们的列表是:['{','1','}'],那么结果应该是[[1]]。但是,它返回的是[[1],'1'],因为一旦它创建了子列表(看起来工作正常),循环要经过的下一个元素“x”实际上是该子列表的一个元素,它是位于{'后面的元素,根据我的代码,它会被附加到列表中。在

我觉得这是一个很容易解决的问题,但我花了很长时间试图弄清楚。正如我已经解释过的,我理解这些问题,但我一辈子都无法找到解决问题的办法。任何帮助将不胜感激!在


Tags: lt元素列表stackdeflengthdictend
1条回答
网友
1楼 · 发布于 2024-06-02 07:48:27

这是在您尝试解决方案的基础上建立的(同时也处理整数):

# This assumes brackets are properly balanced
def parse1(L):
    newL = []
    i = 0
    while i<len(L):
        x = L[i]
        if x == '}':
            # Return the parsed list & the unparsed portion of the original list
            print(newL, L[i:])
            return newL, L[i+1:]
        elif x == '{': 
            # Split rest of L into parsed & unparsed portions
            parsed, unparsed = parse1(L[i+1:])
            # Insert parsed portion into current list
            newL.append(parsed)
            # Reset i & L for unparsed portion
            i, L = 0, unparsed
        else:
            # Convert x to an integer if possible
            try:
                x = int(x)
            except:
                pass
            newL.append(x)
            i += 1
    return newL

相关问题 更多 >