Python嵌套列表词频匹配追加问题:代码实现求助
匹配词频列表并为Token追加对应频率值的解决方案
你有两个嵌套列表需要处理:
freq_list:存储单词、词性(POS)和对应的出现频率tokens:存储待匹配的单词和词性对
你的核心需求是遍历tokens,根据和freq_list的匹配结果分三种情况处理:
- 单词+词性完全匹配:把
freq_list中的对应频率追加到该token后 - 仅单词存在(词性不匹配):自定义处理(比如标记无匹配词性或返回0)
- 单词和词性都不存在:自定义处理(比如返回0或标记未找到)
先把你的原始数据和待完善的代码贴出来:
原始数据
freq_list = [['such', 'JJ', '17930'], ['year', 'NN', '17920'], ['as', 'RB', '17107']] tokens = [['legend', 'NN'], ['of', 'IN'], ['zelda', 'NN'], ['year', 'NN']]
你当前的代码片段(存在问题)
def get_frequency(self, tokens, freq_list): self.__frequencies = [] for token in self.tokens: # 条件判断逻辑有误:会误判不同单词的词性刚好存在的情况 if token[0] in [item[0] for item in self.freq_list] and token[1] in [item[1] for item in self.freq_list]: freq = token, self.freq_list(i) # 语法错误,也没有正确获取对应频率的逻辑
解决方案:优化数据结构+完善分支逻辑
首先,把freq_list转换成字典,用(单词, 词性)作为键,频率作为值,这样查找效率会从O(n)降到O(1),避免每次遍历整个列表。然后完善函数逻辑,覆盖三种分支情况:
class YourClass: # 假设这是你的类结构 def __init__(self): self.__frequencies = [] def get_frequency(self, tokens, freq_list): self.__frequencies = [] # 把freq_list转成字典:键是(单词, 词性)元组,值是转成int的频率 freq_dict = {(item[0], item[1]): int(item[2]) for item in freq_list} # 遍历传入的tokens(修正了你之前误用self.tokens的问题) for token in tokens: word, pos = token # 情况1:单词+词性完全匹配 if (word, pos) in freq_dict: self.__frequencies.append(token + [freq_dict[(word, pos)]]) else: # 检查单词是否存在于freq_list的任何条目里 word_exists = any(item[0] == word for item in freq_list) if word_exists: # 情况2:仅单词存在,词性不匹配,这里可自定义处理 self.__frequencies.append(token + [0]) # 示例:用0标记无匹配词性 else: # 情况3:单词和词性都不存在,自定义处理 self.__frequencies.append(token + [0]) # 示例:用0标记未找到 return self.__frequencies # 测试示例 if __name__ == "__main__": freq_list = [['such', 'JJ', '17930'], ['year', 'NN', '17920'], ['as', 'RB', '17107']] tokens = [['legend', 'NN'], ['of', 'IN'], ['zelda', 'NN'], ['year', 'NN']] obj = YourClass() result = obj.get_frequency(tokens, freq_list) print(result)
代码解释
- 字典转换:
freq_dict将freq_list转换成键值对,直接通过(word, pos)就能快速查到频率,避免重复遍历列表浪费性能。 - 分支处理:
- 完全匹配:直接追加对应的频率值
- 仅单词存在:用
any()快速检查单词是否在freq_list中,你可以根据需求修改处理逻辑(比如返回该单词的最高频率,或者返回字符串提示) - 都不存在:同样自定义处理,示例用0标记,你也可以改成
None或"not found"
- 参数修正:你之前的函数里误用了
self.tokens,这里统一用参数传入的tokens,避免类属性和函数参数混淆。
测试结果
运行代码会输出:
[['legend', 'NN', 0], ['of', 'IN', 0], ['zelda', 'NN', 0], ['year', 'NN', 17920]]
其中最后一个token因为完全匹配,成功追加了频率17920,其他未匹配项按逻辑标记为0。
内容的提问来源于stack exchange,提问作者jan
相关产品推荐
相关产品推荐

