Python代码为何生成重复子列表而非合并统计频次?求助
问题分析与解决:单词类别统计错误修正
问题背景
我们从一个包含单词和对应类别的字符串出发,先将其转换为二维列表:
cadena ="El/DT perro/N come/V carne/N de/P la/DT carnicería/N y/C de/P la/DT nevera/N y/C canta/V el/DT la/N la/N la/N ./Fp" # 将字符串转为二维列表 cadena_list = [] for i in cadena.split(): cadena_list.append(i.split("/"))
目标是构建一个字典words_categories,键为单词,值是二维列表,每个子列表存储[类别, 出现次数]。比如单词"la"的预期结果是:{"la": [["DT", 2], ["N", 3]]}
但当前编写的代码运行后,输出words_categories["la"]得到:['DT', 2, ['N', 1], ['N', 1], ['N', 1]],无法合并相同类别的统计次数。
错误原因
你的代码存在两个核心问题:
- 初始值格式错误:当单词首次存入字典时,你赋值的是
[cadena_list[i][1], 1],这是一个一维列表(类别字符串+数字),但预期的是二维列表(每个元素是子列表)。比如"la"第一次存入时是["DT", 2],而非[["DT", 2]]。 - 类别存在性判断错误:你用
cadena_list[i][1] in l来判断类别是否存在,但l此时是混合结构(比如["DT",2]),这里的判断是检查类别字符串是否在列表的顶层元素中,而不是检查子列表里的类别。当后续遇到"N"类别时,判断会认为不存在,于是不断追加新的["N",1]子列表,而非找到已有类别累加次数。
修正后的代码
基础修正版本
words_categories = {} for word, cat in cadena_list: if word in words_categories: # 遍历当前单词的类别列表,检查是否已有该类别 found = False for item in words_categories[word]: if item[0] == cat: item[1] += 1 found = True break if not found: words_categories[word].append([cat, 1]) else: # 首次存入时直接用二维列表格式 words_categories[word] = [[cat, 1]] print(words_categories["la"])
高效优化版本
如果数据量较大,推荐用嵌套字典先统计次数,再转换为二维列表,利用字典键的唯一性自动合并类别,代码更简洁高效:
words_categories = {} for word, cat in cadena_list: if word not in words_categories: words_categories[word] = {} # 统计每个单词下各类别的次数 words_categories[word][cat] = words_categories[word].get(cat, 0) + 1 # 将嵌套字典转换为要求的二维列表格式 for word in words_categories: words_categories[word] = [[cat, count] for cat, count in words_categories[word].items()] print(words_categories["la"])
验证结果
运行上述修正代码后,words_categories["la"]的输出为:
[['DT', 2], ['N', 3]]
完全符合预期。
内容的提问来源于stack exchange,提问作者Luca P.
相关产品推荐
相关产品推荐

