2017-11-25 197 views
0

目标:我有一个令牌列表。每当有一段由括号包围的令牌时,例如{t1,t2等},我需要将它变成一个新的子列表。下面提供了一个我期望的结果的例子。在Python中解析令牌列表


解析:[ '(事实上)', 'DUP', '长度', '/ N', 'EXCH', 'DEF', '/事实', '{', '0', '''','','','','','','''''',' n','1','sub','fact','n','mul','}','ifelse','end','}','def','n','fact' ,'stack'])

返回: ['(facto)','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”实际上是该子列表的一个元素,它是紧跟在'{'之后的元素,根据我的代码,它被添加到列表中。

我觉得这是一个非常简单的解决方法,但我花了很长时间试图弄清楚。正如我已经解释的那样,我理解这些问题,但不能在我的生活中弄清楚如何解决它。任何帮助将不胜感激!

+0

这不是一个简单的办法;你正在处理一个子列表和处理列表的其余部分。 –

+0

我正在考虑尝试在不使用for循环迭代器的情况下重新执行它,并尝试手动遍历列表,如L [0],L [1]等,然后尝试找到更改索引的方法在我处理了一个子列表之后。 在这一点上,我只是非常疲惫的选择,我花了一段时间在这个。 – Birdman

+0

您的预期输出似乎期望将整数字符串转换为整数,但您的代码甚至不会尝试执行此操作。 –

回答

0

这一个解决方案是仿照你的尝试(兼营整数):

# 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