“列表分配索引超出范围”错误

时间:2018-11-17 16:29:40

标签: python list function

我正在尝试使用函数在python中做简单的'NLP'。

由于某种原因,每当我运行代码时,第一个字符串都可以正常工作,但是每当我运行第二个字符串时,我都会收到一条错误消息(“列表索引超出范围”)。

def sentence_to_words(s):
    s=s.lower()
    s=s.split(" ")
    lst=["$", "#", "%", "!", "?", ".", ","]
    for i in range(len(s)):
        s[i]=list(s[i])
        while s[i][0] in lst:
            del s[i][0]
        while s[i][-1]in lst:
            del s[i][-1]
        s[i]=''.join(s[i])
    return (s)

print sentence_to_words("Will this work?")
print sentence_to_words("Mr. Stark ... I don't feel so good")

两者的最终结果应为:

['will' , 'this' , 'work']
["mr" , "stark" , "i" , "don't" , "feel" , "so" , "good"] 

但是第二个实际上并没有运行,而是收到一条错误消息。

3 个答案:

答案 0 :(得分:1)

两个while循环中都有一个错误,乍一看并不清楚。 您要在第一个输入中删除s[i]的索引:0,而...在第二个输入中。 s[i]列表在这种情况下为:['.', '.', '.']

因此,您的第一个while将呼叫3次,并将s[i]列表设为空白。然后,您尝试在第二个while条件中访问它的索引-1。现在猜怎么着?由于列表为空,因此不再有-1索引。您唯一要做的就是向第二个while添加另一个条件,以防止在空数组中这样做。这是您的代码:

def sentence_to_words(s):
s=s.lower()
s=s.split(" ")
lst=["$", "#", "%", "!", "?", ".", ","]
for i in range(len(s)):
    s[i]=list(s[i])
    while s[i][0] in lst:
        del s[i][0]
        if not s[i]:
            break
    while s[i] and s[i][-1]in lst:
        del s[i][-1]
    s[i]=''.join(s[i])
return (s)

print statement_to_words(“这行得通吗?”) 打印statement_to_words(“史塔克先生……我不太舒服”) 有2个变化。每次在第一个while的结尾处,我们都会检查列表是否为空。如果是,我们将打破循环并避免出现第一个错误。

第二个更改位于第二个while的开头。在这里,我们首先检查s[i]是否为空。当处于循环状态时,Python会将一个空列表转换为False。因此,现在我们不会再出现任何错误。

您可以在第一个循环的末尾删除if语句,然后执行与第二个循环相同的操作,我只是将其放在此处以向您显示可以以不同方式解决此问题。

答案 1 :(得分:0)

在第二个示例中,"..."字符串给您带来了问题。

该字符串中的所有字符都在要删除的字符列表中。

这意味着在第一个while中,所有字符都会被删除,但是当您尝试访问其“第一个”字符时,由于它为空而遇到了错误!

一种快速解决方案是仅添加一个附加条件:s[i],这意味着当字符串为空时,while循环将继续进行。

最后,您必须处理此结束字符串,因为您不能只将其留在输出中。

理想情况下,您应该将其从s列表中删除,但是由于要遍历s列表,因此无法使用。

相反,更有意义的是生成一个新的output列表,将“解析的”单词发送到该列表。

这就是代码中的内容:

def sentence_to_words(s):
    s = s.lower()
    s = s.split(" ")
    lst = ["$", "#", "%", "!", "?", ".", ","]
    output = []
    for i in range(len(s)):
        s[i] = list(s[i])
        while s[i] and s[i][0] in lst:
            del s[i][0]
        while s[i] and s[i][-1] in lst:
            del s[i][-1]
        if s[i]:
            output.append(''.join(s[i]))
    return output

print sentence_to_words("Will this work?")
print sentence_to_words("Mr. Stark ... I don't feel so good")

现在它可以按预期运行:

>>> sentence_to_words("Will this work?")
['will', 'this', 'work']
>>> sentence_to_words("Mr. Stark ... I don't feel so good")
['mr', 'stark', 'i', "don't", 'feel', 'so', 'good']

答案 2 :(得分:-2)

尝试一下

def sentence_to_words(s):
 mylist = []
 s = s.lower()
 s = s.split(' ')
 for i in s:
         mylist.append(''.join(ch for ch in i if ch.isalnum()))
 return list(filter(None, mylist))