You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么第二次将nltk.bigrams的生成结果转为列表时得到空列表?

问题原因

你遇到的现象不是bug,也不是nltk.bigrams的专属特殊设计,本质是Python迭代器(iterator)的遍历耗尽特性。
nltk.bigrams() 函数返回的结果不是预先生成好的静态列表,而是一个惰性计算的迭代器对象:

  • 迭代器为了节省内存,不会一次性生成所有元素,只会在遍历的时候逐个计算产出元素
  • 迭代器内部维护了遍历指针,遍历完成一次后指针就会走到迭代器末尾,不会自动重置,第二次遍历时没有剩余元素可以产出,转为列表就会得到空值。

对应你代码的执行逻辑:

  1. 第一次执行list(bigrams)时,完整遍历迭代器,收集所有二元组返回结果,同时迭代器指针走到终点,没有剩余元素
  2. 第二次执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 23:45:09