Python文件单词提取代码报错:TypeError: 'NoneType'不可迭代
Python提取单词代码报错的原因及修复方案
Hey Michael, let's figure out why your code is throwing that error and get it working properly.
你的代码与报错信息
你编写的提取文件单词的代码:
fname = input("Enter file name: ") fh = open(fname) lst = list() word = list() for line in fh: lst = line.split() for w in lst : if not w in word : word = word.append(w) word = word.sort() print(word)
运行时触发的错误:
if not w in word : TypeError: argument of type 'NoneType' is not iterable
报错的核心原因
这个错误完全是因为误解了Python列表方法的返回值:
list.append()方法:它是在原列表末尾添加元素的原地修改操作,执行后返回的是None。你写了word = word.append(w),相当于把原本是列表的word变量直接替换成了None。当循环进入下一次判断if not w in word时,word已经变成None,而None无法被用来做“元素是否存在”的判断,所以抛出了NoneType不可迭代的错误。- 另外你后面的
word = word.sort()也犯了同样的错误:list.sort()是原地排序操作,返回值同样是None,这会让最终的word变成None,就算前面没报错,最后print(word)也只会输出None。
修正后的代码
只需要去掉多余的赋值操作,直接调用列表方法即可:
fname = input("Enter file name: ") fh = open(fname) word = list() for line in fh: lst = line.split() for w in lst : if w not in word : # 这里改成更符合Python风格的写法也可以 word.append(w) word.sort() print(word)
额外优化方案
如果文件里的单词数量较多,用列表判断元素是否存在的效率比较低,推荐用集合来去重(集合自动去重,且判断元素存在的速度更快),最后再转成排序后的列表:
fname = input("Enter file name: ") fh = open(fname) word_set = set() for line in fh: for w in line.split(): word_set.add(w) word_list = sorted(word_set) # sorted()会返回一个新的排序后的列表,不会修改原集合 print(word_list)
内容的提问来源于stack exchange,提问作者Michael Lin
相关产品推荐
相关产品推荐

