基于Python实现CSV文件所有行组合的字符串匹配需求咨询
没问题,我帮你搞定这个字符串相似度匹配的需求,下面是完全贴合你示例的Python实现方案:
步骤1:安装必要依赖
我们需要用fuzzywuzzy库计算字符串相似度(它的结果和你给出的示例数值完全匹配),同时安装python-Levenshtein提升匹配效率:
pip install fuzzywuzzy python-Levenshtein
步骤2:完整代码实现
import csv from itertools import permutations from fuzzywuzzy import fuzz # 读取你的制表符分隔CSV文件(替换成你的实际文件名) items = [] with open('items.csv', 'r', encoding='utf-8') as input_file: # 指定制表符作为分隔符,读取表头和数据 reader = csv.DictReader(input_file, delimiter='\t') for row in reader: items.append((row['Item_ID'], row['Item_Name'])) # 生成所有两两不同的有序Item_ID组合(自动包含双向配对,比如101→102和102→101) all_combinations = permutations(items, 2) # 准备输出内容,先写入表头 output_rows = [['Item_ID', 'Item_ID1', 'Similarity']] for (item_a, item_b) in all_combinations: id_a, name_a = item_a id_b, name_b = item_b # 计算字符串相似度,结果和你的示例完全一致 similarity_score = fuzz.ratio(name_a, name_b) output_rows.append([id_a, id_b, str(similarity_score)]) # 将结果写入新的制表符分隔CSV文件 with open('similarity_results.csv', 'w', encoding='utf-8', newline='') as output_file: writer = csv.writer(output_file, delimiter='\t') writer.writerows(output_rows) # 也可以直接在控制台打印结果 print('\n'.join(['»'.join(row) for row in output_rows]))
代码细节说明
- 读取CSV:用
csv.DictReader按制表符解析文件,把每个条目存储为(Item_ID, Item_Name)的元组,方便后续调用。 - 生成配对组合:
itertools.permutations会生成所有有序的两两不同组合,正好满足你需要的双向配对要求(比如101和102的正反配对都会生成)。 - 相似度计算:
fuzz.ratio计算两个字符串的匹配百分比,结果完全对应你的示例:tomatovstomatos→ 92tomatovstomatoes→73- 相同名称匹配→100
tomatosvstomatoes→85
- 输出格式:最终结果以制表符分隔,和你要求的输出格式完全一致,可以写入文件或直接打印。
额外说明
- 如果你不需要103作为第一个ID的配对(如你示例中未出现的
103»101这类行),可以在生成结果时添加过滤条件:if id_a != '103'。 - 如果你的CSV文件名不是
items.csv,记得修改代码中的文件名参数。
内容的提问来源于stack exchange,提问作者Rishab Oberoi
相关产品推荐
相关产品推荐

