为什么第二次将nltk.bigrams的生成结果转为列表时得到空列表?
问题原因
你遇到的现象不是bug,也不是nltk.bigrams的专属特殊设计,本质是Python迭代器(iterator)的遍历耗尽特性。nltk.bigrams() 函数返回的结果不是预先生成好的静态列表,而是一个惰性计算的迭代器对象:
- 迭代器为了节省内存,不会一次性生成所有元素,只会在遍历的时候逐个计算产出元素
- 迭代器内部维护了遍历指针,遍历完成一次后指针就会走到迭代器末尾,不会自动重置,第二次遍历时没有剩余元素可以产出,转为列表就会得到空值。
对应你代码的执行逻辑:
- 第一次执行
list(bigrams)时,完整遍历迭代器,收集所有二元组返回结果,同时迭代器指针走到终点,没有剩余元素 - 第二次执行
list(bigrams)时,从指针当前的末尾位置开始遍历,拿不到任何元素,返回空列表。
解决方法
方法1:提前转为列表存储
如果需要多次使用bigrams结果,生成时直接转为列表留存,后续直接复用该列表变量即可:
sent = ['Python', 'is', 'fun'] bigrams_list = list(nltk.bigrams(sent)) print(bigrams_list) print(bigrams_list)
两次输出均为[('Python', 'is'), ('is', 'fun')]
方法2:每次使用时重新生成迭代器
如果不需要留存结果,每次调用时重新执行nltk.bigrams()生成新的迭代器即可:
sent = ['Python', 'is', 'fun'] print(list(nltk.bigrams(sent))) print(list(nltk.bigrams(sent)))
内容的提问来源于stack exchange,提问作者Polina
相关产品推荐
相关产品推荐

