【问题标题】:Parsing a list of tokens in Python在 Python 中解析标记列表
【发布时间】:2017-11-25 23:37:27
【问题描述】:

目标:我有一个令牌列表。每当有一段被方括号包围的标记时,例如 {t1,t2,etc.},我需要将其放入一个新的子列表中。下面提供了我想要的结果的示例。


解析:['(facto)', 'dup', 'length', '/n', 'exch', 'def', '/fact', '{', '0', 'dict', '开始','/n','exch','def','n','2','lt','{','1','}','{','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”实际上是该子列表的一个元素,它是'{'之后的元素,根据我的代码,它会被附加到列表中。

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

【问题讨论】:

  • 这不是一个简单的解决方案;您将处理子列表与处理列表的其余部分混为一谈。
  • 我正在考虑尝试在不使用内置 for 循环迭代器的情况下重新执行此操作,并尝试手动遍历 L[0]、L[1] 等列表,然后尝试在我处理完子列表后找到更改索引的方法。在这一点上,我已经筋疲力尽了,我已经花了一段时间了。
  • 您的预期输出似乎期望将整数字符串转换为整数,但您的代码甚至没有尝试这样做。
  • 更改索引(如果您使用的是 while 循环)就像分配一个整数一样简单。
  • @ScottHunter 是的,我在整数方面也遇到了一些问题。但现在我只是想在担心格式化之前让列表正确形成。我尝试了一些检查以确定是 x.isdigit,如果它是真的,我尝试了 newL.append(int(x)),但这似乎不起作用。我也在努力解决这个问题。

标签: python algorithm python-3.x character token


【解决方案1】:

这是根据您对解决方案的尝试建模(并且还处理整数):

# 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    相关资源
    最近更新 更多