如何高效创建词汇表中单词到索引的映射字典?
高效构建单词到索引的映射字典
绝对不用反复调用vocabulary.index(w)——这玩意儿每次都要遍历整个列表,几千次调用下来效率低得离谱。直接用Python原生的字典推导式或者enumerate就能搞定,时间复杂度直接从O(n*k)降到O(n)(构建字典)+ O(1)(单次查找),完美解决你的问题。
最直接的实现方式
假设你的去重词汇表是一个列表vocabulary,一行代码就能生成映射字典:
word_to_idx = {word: idx for idx, word in enumerate(vocabulary)}
比如你的词汇表是["cat", "dog", "bird"],生成的字典就是{"cat":0, "dog":1, "bird":2}。之后要查某个单词的索引,直接word_to_idx["cat"]就行,比vocabulary.index("cat")快几个数量级。
处理未知单词的进阶方案
如果你的场景里可能遇到不在词汇表中的单词,不想触发KeyError,可以用collections.defaultdict给未知单词设置默认值(比如-1):
from collections import defaultdict word_to_idx = defaultdict(lambda: -1) word_to_idx.update({word: idx for idx, word in enumerate(vocabulary)})
这样遇到陌生单词时,word_to_idx["unknown_word"]会返回-1,不用额外做异常处理。
为什么list.index()这么慢?
简单说,list.index(w)每次调用都会从头遍历整个列表,直到找到匹配的元素——时间复杂度是O(n)。如果你要查k个单词,总时间就是O(n*k)。而字典的哈希表结构天生支持O(1)的查找,只要花一次O(n)的时间构建好字典,之后所有查找都是瞬时的,对于几千个单词的场景来说,性能提升非常明显。
内容的提问来源于stack exchange,提问作者quanty
相关产品推荐
相关产品推荐

