首页 > 解决方案 > “列表分配索引超出范围”错误

问题描述

我正在尝试使用函数在 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"] 

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

标签: pythonlistfunction

解决方案


您的两个循环中都有一个错误,while乍一看并不清楚。您正在删除 index: 0 of s[i]in first 而...在您的第二个输入中。在这种情况下,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 sentence_to_words("Will this work?") print sentence_to_words("Mr. Stark ... I don't feel so good") 有 2 个变化。每次在 first 结束时,while我们都会检查列表是否为空。如果是,我们将打破循环并避免第一个错误。

第二个变化是在第二个开始while。这里我们先检查s[i]不为空。Python 会将空列表转换为何False时处于循环条件。所以现在我们不会再收到任何错误了。

您可以在第一个循环结束时删除 if 语句并执行与第二个循环相同的操作,我只是将其放在那里向您展示您可以通过不同的方式解决此问题。


推荐阅读