如何解决使用defaultdict统计分类下搜索建议计数时返回空列表的问题
问题根因
- 核心错误是
defaultdict默认类型配置错误:你声明的是defaultdict(list),代表每个分类对应的默认值为列表,但后续代码用字典键值对的方式赋值dictionary[category][suggestion] = 1,列表不支持键索引访问,所以无法正常存储数据。 - 次要问题是直接用正则清洗后
split()拆分内容,会把原本带空格的完整搜索建议(比如jio tv)拆成多个独立单词,不符合原始搜索建议的统计需求。 - 冗余逻辑:你额外写了判断搜索词是否存在的分支,用
defaultdict(int)可以省略该判断,自动初始化不存在的键值为0。
修正方案
方案1:按完整搜索建议统计(推荐)
使用ast.literal_eval把DataFrame里字符串格式的列表转成真实列表,避免正则拆分破坏原始内容:
import pandas as pd from collections import defaultdict import ast # 外层字典的每个值默认是用于计数的defaultdict,默认计数为0 dictionary = defaultdict(lambda: defaultdict(int)) for i in range(df.shape[0]): # 转换字符串格式的分类列表为真实列表并去重 categories = set(ast.literal_eval(df.loc[i, 'category'])) # 转换字符串格式的搜索建议列表为真实列表并去重 suggestions = set(ast.literal_eval(df.loc[i, 'suggestions'])) for cate in categories: for sug in suggestions: dictionary[cate][sug] += 1
方案2:按单个单词统计(如果你需要拆分搜索词)
如果你的需求确实是把搜索建议拆成单个单词统计,只需要修正defaultdict的默认类型即可:
import pandas as pd import re from collections import defaultdict dictionary = defaultdict(lambda: defaultdict(int)) for i in range(df.shape[0]): categories = set(re.sub(r'[^\w\s]', '', df.loc[i, 'category']).split()) for category in categories: suggestions = set(re.sub(r'[^\w\s]', '', df.loc[i, 'suggestions']).split()) for suggestion in suggestions: dictionary[category][suggestion] += 1
内容的提问来源于stack exchange,提问作者Mohd Abdul Azeem
相关产品推荐
相关产品推荐

