Python列表单词频次统计生成字典列表:代码输出不符预期求助
问题排查:字符串频次统计代码错误分析
需求说明
统计列表中每个唯一字符串的出现频次,整理为字典列表,每个字典以目标字符串为键、对应频次为值。
示例
输入:
word_list=["I","am","bob","I","am","hungry"]
预期输出:
dict_list=[{"I":2},{"am":2},{"bob":1},{"hungry":1}]
错误代码及输出
编写的代码运行结果与预期不符:
word_list=["I","am","bob","I","am","hungry"] dict_list=[{"placeholder":0}] for word in word_list: for i in range(len(dict_list)): if word not in dict_list[i].keys(): dict_list.append({word:1}) break elif word in dict_list[i].keys(): dict_list[i][word]+=1 break dict_list.pop(0) print(dict_list) # 输出结果:[{'I': 1}, {'am': 1}, {'bob': 1}, {'I': 1}, {'am': 1}, {'hungry': 1}] # 预期结果:[{"I":2},{"am":2},{"bob":1},{"hungry":1}]
问题原因
代码逻辑的核心错误在于:每次处理单词时,只检查列表中的第一个字典是否包含当前单词。如果第一个字典里没有该单词,就直接新增一个新字典,完全没去检查列表中后续已存在的其他字典。
比如处理第二个"I"时,程序会先检查初始的{"placeholder":0}字典,发现"I"不在其中,就直接追加一个新的{"I":1}字典,而不是去列表后面找已经存在的{"I":1}字典进行计数累加。这就导致了相同键的字典被重复创建。
修正方案
需要先遍历整个字典列表,确认当前单词是否已经存在于任何一个字典中。如果存在就累加计数,遍历完所有字典都没找到的情况下,再新增对应的字典。
修正后的代码
word_list=["I","am","bob","I","am","hungry"] dict_list = [] for word in word_list: # 标记是否找到已存在的单词字典 found = False for item in dict_list: if word in item: item[word] += 1 found = True break # 如果没找到,新增字典 if not found: dict_list.append({word: 1}) print(dict_list) # 输出:[{'I': 2}, {'am': 2}, {'bob': 1}, {'hungry': 1}]
更简洁的实现(可选)
可以先用普通字典统计频次,再转换成要求的字典列表,效率更高:
word_list=["I","am","bob","I","am","hungry"] count_dict = {} # 先统计频次 for word in word_list: count_dict[word] = count_dict.get(word, 0) + 1 # 转换成字典列表 dict_list = [{k: v} for k, v in count_dict.items()] print(dict_list) # 输出:[{'I': 2}, {'am': 2}, {'bob': 1}, {'hungry': 1}]
内容的提问来源于stack exchange,提问作者Andrey Kudritskiy
相关产品推荐
相关产品推荐

