使用Python的.isdigit()函数时报列表索引类型错误该如何解决?
问题分析
你代码触发报错的核心原因是列表遍历逻辑错误:
- 执行
for token in sentence时,迭代得到的token是列表的元素本身(即字符串类型的分词结果,例如"5"、"test"),并非元素对应的下标索引。你直接拿字符串作为索引访问sentence[token],自然会触发「列表索引必须是整数或切片,不能是字符串」的报错。 - 此外你的代码还存在两处冗余问题:
else分支无任何执行逻辑,属于无效代码;直接修改传入的列表对象会改动原输入,可能引发预期外的副作用。
优化方案
场景1:输入为预分词后的列表
如果你的sentence参数是已经拆分好的分词列表,可直接用以下两种写法:
写法1(推荐,不修改原输入):
def number_normalise(sentence): processed = [] for token in sentence: processed.append("NUM" if token.isdigit() else token) return processed
更简洁的列表推导式版本:
def number_normalise(sentence): return ["NUM" if token.isdigit() else token for token in sentence]
写法2(直接修改原列表,按需使用):
如果确实需要修改原输入列表,可通过enumerate获取下标操作:
def number_normalise(sentence): for idx, token in enumerate(sentence): if token.isdigit(): sentence[idx] = "NUM" return sentence
场景2:输入为未分词的完整字符串
如果传入的是整句字符串,可先拆分再处理,以英文句子为例:
def number_normalise(sentence: str): # 按空格拆分英文句子 tokens = sentence.split() processed_tokens = ["NUM" if token.isdigit() else token for token in tokens] # 拼接回字符串返回 return " ".join(processed_tokens)
内容的提问来源于stack exchange,提问作者user14994313
相关产品推荐
相关产品推荐

