Python中检查列表非空仍触发IndexError: list index out of range问题
解决IndexError: list index out of range问题
嘿,我来帮你捋清楚这个问题的根源~你的代码触发索引越界,核心原因是循环过程中修改了原列表的长度,但循环范围是基于最初的列表长度生成的。
举个实际例子:假设tweetSplit一开始是["@alice", "hello", "", "@bob"],长度为4,循环的i会从0跑到3。当i=0时,你删除了@alice,列表变成["hello", "", "@bob"],长度缩成3。但循环还是会继续执行到i=3,此时列表的最大索引是2,访问tweetSplit[3]自然就会报错。而你写的if not tweetSplit只有当列表完全为空时才会break,大部分场景下列表还剩元素,这个判断根本起不到作用。
下面给你两种实用的解决办法:
方法1:反向遍历列表
反向遍历的时候,即使前面的元素被删除,后面的索引不会受影响,因为我们从后往前处理元素:
tweetSplit = tweet.split(' ') # 从最后一个索引开始,倒着往前遍历 for i in range(len(tweetSplit)-1, -1, -1): if tweetSplit[i] != "": if tweetSplit[i][:1] == '@': del tweetSplit[i]
方法2:创建新列表(更推荐)
直接生成一个过滤后的新列表,这种方式不修改原列表,逻辑更清晰,也彻底避免了索引问题:
tweetSplit = tweet.split(' ') # 过滤掉空字符串和以@开头的元素 new_tweet_split = [item for item in tweetSplit if item != "" and not item.startswith('@')] # 如果需要替换原列表,直接赋值即可 tweetSplit = new_tweet_split
额外补充个小技巧:tweet.split(' ')遇到连续空格会生成空字符串,如果你想自动忽略所有空白字符(包括连续空格、制表符等),可以用tweet.split()不带参数,这样能直接得到无空字符串的列表,还能简化你的代码~
内容的提问来源于stack exchange,提问作者user1098432
相关产品推荐
相关产品推荐

