如何统计list1元素在list2各字符串中的出现频率并导出为CSV?
解决列表元素频率统计与CSV保存问题
嘿,我来帮你搞定这个问题!首先得先说说你代码报错的核心原因——你在循环里把迭代变量命名成了list1和list2,这直接覆盖了原来的列表对象!比如第一次for list1 in list1执行后,list1就变成了字符串'cat',后续再循环的时候自然会报错,因为字符串没法被迭代。这是个很容易踩的新手坑,得先把变量名改对。
接下来咱们一步步实现需求:统计list1每个元素在list2各字符串中的出现频率,最后把结果存成指定格式的CSV。
步骤1:修正循环逻辑+正则匹配完整单词
首先要确保匹配的是完整单词(避免把dogs里的dog误统计),所以正则里要加单词边界\b,同时用re.escape()处理元素,防止元素里有正则特殊字符导致匹配出错。
import re import csv # 定义原始列表 list1 = ['cat', 'dog', 'man'] list2 = ['cat is sleeping', 'cat is running', 'cat and dogs is sleeping ', 'man dog cat is running'] # 初始化统计字典:键是list1的元素,值是对应每个句子的计数列表 frequency_counts = {item: [] for item in list1} # 遍历每个句子 for sentence in list2: # 遍历每个要统计的元素 for item in list1: # 正则匹配完整单词,转义特殊字符避免语法错误 matched_items = re.findall(r'\b{}\b'.format(re.escape(item)), sentence) # 把当前句子的出现次数加入列表 frequency_counts[item].append(len(matched_items))
步骤2:将统计结果写入CSV
按照你的要求,CSV的行是list1的元素,列是list2的每个字符串。我们可以直接用Python内置的csv模块来实现:
# 构建CSV表头:第一列是"元素",后续列是list2的每个句子 csv_header = ['元素'] + list2 # 构建每行数据:元素名 + 对应各句子的计数 csv_rows = [] for item in list1: csv_rows.append([item] + frequency_counts[item]) # 写入CSV文件(newline=''避免空行,utf-8保证编码正确) with open('word_frequency.csv', 'w', newline='', encoding='utf-8') as csv_file: writer = csv.writer(csv_file) writer.writerow(csv_header) writer.writerows(csv_rows)
最终CSV效果
生成的CSV内容大概是这样的:
元素,cat is sleeping,cat is running,cat and dogs is sleeping ,man dog cat is running cat,1,1,1,1 dog,0,0,0,1 man,0,0,0,1
这里要注意:第三个句子里的dogs因为是复数,用\b边界匹配的话不会被统计成dog,如果你不需要区分单复数,可以去掉\b,但通常统计完整单词更符合需求~
内容的提问来源于stack exchange,提问作者Shayez Karim
相关产品推荐
相关产品推荐

