2017-09-22 134 views
-1

这些是操作的指令:记号化功能未按预期运行 - 的Python

写功能tokenize(input_string)该取含有表达的字符串并返回令牌的列表。这种小语言的令牌将被空白分隔,所以任何时候输入字符串中都有一个空格(或者一行空格),我们想要分割它。

你不应该使用内置的字符串操作分裂,而是应该用我们到目前为止开发的工具构建你的代码。

当一切都说过和做过,例如,运行在这个字符串标记生成器: tokenize("2 2 + 3 4/.5 0.2 3.2 + - COS")

应该返回: ['2', '2', '+', '3', '4', '/', '.5', '0.2', '3.2', '+', '-', 'COS']

这是我的代码:

def tokenize(input_string): 
    tokens = [] 
    token = "" 
    for char in input_string: 
     if char == " " and input_string[-1] != char and token != "": 
      tokens.append(token) 
      token = "" 
     elif input_string[-1] == char: 
      tokens.append(token + char) 
     elif char != " ": 
      token += char 
    return tokens 

我的代码适用于给定的示例和类似的参数,但是当我运行类似于: tokenize("pi load store load")

我得到: ['pi', 'load', 'loa', 'store', 'load'] 有什么错误吗?试图用打印语句在功能的各个部分找到它无济于事。任何关于如何更好地组织if语句的建议都将不胜感激。先谢谢您的帮助。

+0

首先解决您的缩进。 –

+0

你问问什么是错误,但你没有说出你用'tokenize(“pi load store load”)看到的东西' –

+1

'input_string [-1]'不是你认为的那样 – kdopen

回答

0

我觉得你的缺陷是在该行elif input_string[-1] == char:

如果我正确地理解了你,你试图使用这个elif的情况来检查你是否在字符串的末尾,如果你是,将字符串中的最后一个标记添加到你的标记列表。

但是,如果你的最后一个字符在字符串中多次出现,它会进入这种情况下,每一次;这就是为什么你的列表中有'loa''load'

我的建议是删除所有检查的当前角色是一样的字符串中的最后一个字符,和你的循环之后添加

if token != "": 
    tokens.append(token) 

0

为了增加艾萨克魏斯回答,请简化您对检查逻辑,这可能是一个解决方案:

def tokenize(input_string): 
    tokens = [] 
    token = '' 
    for char in input_string: 
     if char == ' ': # Possible token termination 
      if token != '': 
       tokens.append(token) 
       token = '' 
     else: 
      token += char 

    # Last token 
    if token != '': 
     tokens.append(token) 

    return tokens 
0

这里是2点的方法:

当然也有其他的(例如,那些使用递归,或者甚至正则表达式),但它们可能太高级了。

def tokenize_plain(input_string): 
    tokens = list() 
    current_token = "" 
    for char in input_string: 
     if char == " ": 
      if current_token: 
       tokens.append(current_token) 
       current_token = "" 
     else: 
      current_token += char 
    if current_token: 
     tokens.append(current_token) 
    return tokens 


def tokenize_find(input_string): 
    tokens = list() 
    start = 0 
    end = input_string.find(" ", start) 
    while end != -1: 
     if end == start: 
      start += 1 
     else: 
      tokens.append(input_string[start: end]) 
      start = end 
     end = input_string.find(" ", start) 
    end = input_string.rfind(" ", start) 
    if end == -1: 
     tokens.append(input_string[start:]) 
    else: 
     tokens.append(input_string[start: end]) 
    return tokens 


if __name__ == "__main__": 
    for tokenize in [tokenize_plain, tokenize_find]: 
     for text in ["pi load store load", "2 2 + 3 4/.5 0.2 3.2 + - COS"]: 
      print("{}('{}') = {}".format(tokenize.__name__, text, tokenize(text))) 

输出

c:\Work\Dev\StackOverflow\q46372240>c:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe a.py 
tokenize_plain('pi load store load') = ['pi', 'load', 'store', 'load'] 
tokenize_plain('2 2 + 3 4/.5 0.2 3.2 + - COS') = ['2', '2', '+', '3', '4', '/', '.5', '0.2', '3.2', '+', '-', 'COS'] 
tokenize_find('pi load store load') = ['pi', 'load', 'store', 'load'] 
tokenize_find('2 2 + 3 4/.5 0.2 3.2 + - COS') = ['2', '2', '+', '3', '4', '/', '.5', '0.2', '3.2', '+', '-', 'COS'] 
+0

我认为你的答案使用python内建函数在这里是不允许的,因为可能声明“你不应该使用内置的字符串操作split,而是应该构造你的使用我们迄今为止开发的工具的代码“意味着用普通的python来完成所有的工作。在这种情况下,您的tokenize_plain,这等于我的答案,可能是解决方案。 –

+0

@ GabrielAvellaneda:这是一个技术问题。 _“你不应该使用内置的字符串操作拆分”_是唯一的禁止规则,'tokenize_find'不会破坏它。但无论如何,我正在开发我的答案(当你想出你的答案时),所以我不得不多余地......“手动”字符串标记化问题是“常识”(至少我使用了相同的方法10多年以前的工作interveiew) – CristiFati