python - “列表分配索引超出范围”错误
问题描述
我正在尝试使用函数在 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"]
但是第二个实际上并没有运行,而是收到一条错误消息。
解决方案
您的两个循环中都有一个错误,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 语句并执行与第二个循环相同的操作,我只是将其放在那里向您展示您可以通过不同的方式解决此问题。
推荐阅读
- angular - hperlink 没有在 Angular UI 中嵌入或正确读取
- python - 以数组形式接收来自 python 的响应 - PHP
- javascript - 清除 CSS:无法解析 'stylesheets/critical.scss'
- delphi - 如何实现 TPanel.OnEndResize 事件处理程序?
- flutter - 如何在 Flutter 中制作可以平移和缩放的折线图?
- python-3.x - 是否可以在将方法用作副作用时模拟方法?为了控制/查看该模拟的输入和输出
- macos - 如何为 ZSH Prompt Mac 11.3.1 BigSur 2021 配置红/绿输出
- c# - CS0534 'AppContainer' 未实现继承的抽象成员 'TitleBarTabs.CreateTab()'
- folium - 在 Folium 中,我可以单击标记以显示更多点吗?
- html - 悬停后如何防止悬停动画突然结束?