2017-11-25 230 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