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

Python嵌套列表词频匹配追加问题:代码实现求助

匹配词频列表并为Token追加对应频率值的解决方案

你有两个嵌套列表需要处理:

  • freq_list:存储单词、词性(POS)和对应的出现频率
  • tokens:存储待匹配的单词和词性对

你的核心需求是遍历tokens,根据和freq_list的匹配结果分三种情况处理:

  1. 单词+词性完全匹配:把freq_list中的对应频率追加到该token后
  2. 仅单词存在(词性不匹配):自定义处理(比如标记无匹配词性或返回0)
  3. 单词和词性都不存在:自定义处理(比如返回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)

代码解释

  1. 字典转换:freq_dict将freq_list转换成键值对,直接通过(word, pos)就能快速查到频率,避免重复遍历列表浪费性能。
  2. 分支处理:
    • 完全匹配:直接追加对应的频率值
    • 仅单词存在:用any()快速检查单词是否在freq_list中,你可以根据需求修改处理逻辑(比如返回该单词的最高频率,或者返回字符串提示)
    • 都不存在:同样自定义处理,示例用0标记,你也可以改成None或"not found"
  3. 参数修正:你之前的函数里误用了self.tokens,这里统一用参数传入的tokens,避免类属性和函数参数混淆。

测试结果

运行代码会输出:

[['legend', 'NN', 0], ['of', 'IN', 0], ['zelda', 'NN', 0], ['year', 'NN', 17920]]

其中最后一个token因为完全匹配,成功追加了频率17920,其他未匹配项按逻辑标记为0。

内容的提问来源于stack exchange,提问作者jan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:19:28