Python实现识别CSV中visitor与guest角色互换的重复行
解决CSV中
visitor+guest与guest+visitor组合的匹配问题 嗨,作为Python新手碰到这个问题太正常啦!我来给你捋清楚怎么解决——核心思路是把visitor+guest和guest+visitor变成同一个“标准化标识”,这样就能轻松识别它们是匹配的组合了。下面是具体的步骤和代码:
关键思路
我们可以把每一行的visitor和guest值做一个无序化处理:比如把两个值排序后做成元组(因为列表不能当字典的键,元组可以)。这样不管是Alice+Bob还是Bob+Alice,排序后的元组都是('Alice', 'Bob'),就能用这个元组作为键来跟踪已经出现过的行。
完整代码示例
import csv # 用来存储已经见过的组合及其对应的行数据 seen_combinations = {} # 用来收集所有匹配的行 matched_rows = [] # 替换成你的CSV文件路径,注意编码如果是gbk可以改成encoding='gbk' with open('your_file.csv', mode='r', encoding='utf-8') as csv_file: # 使用DictReader可以通过列名直接获取字段,非常适合新手 csv_reader = csv.DictReader(csv_file) for row in csv_reader: # 提取visitor和guest字段,记得把列名改成你CSV里实际的列名! visitor = row['visitor'].strip() # strip()去掉首尾空格,避免空格导致的误判 guest = row['guest'].strip() # 生成标准化的组合键:排序后转成元组,让顺序不影响匹配 combination_key = tuple(sorted((visitor, guest))) if combination_key in seen_combinations: # 如果这个组合之前出现过,把之前的行和当前行都加入匹配列表 matched_rows.append(seen_combinations[combination_key]) matched_rows.append(row) # 可选:删除这个键,避免同一组合被多次匹配(比如第三行又出现相同组合时不会重复收集) del seen_combinations[combination_key] else: # 如果是第一次见到这个组合,把当前行存进字典 seen_combinations[combination_key] = row # 输出结果 print("找到的匹配行:") for count, row in enumerate(matched_rows, 1): print(f"第{count}行:{row}")
代码解释
csv.DictReader:这个工具可以让你通过列名(比如row['visitor'])获取字段值,比用索引(比如row[0])更直观,不容易出错。strip():处理字段中可能存在的首尾空格,比如"Alice "和"Alice"会被当成不同的值,用strip()可以避免这种误判。tuple(sorted(...)):这是核心!排序后不管两个值的顺序如何,都会得到相同的元组,比如('Bob', 'Alice')排序后变成('Alice', 'Bob'),这样就能识别出角色互换的匹配。- 字典跟踪:用
seen_combinations字典记录已经出现过的组合,当再次遇到相同的标准化键时,就说明找到了匹配的行。
特殊情况处理
- 如果你的CSV没有表头:改用
csv.reader,通过索引访问字段,代码调整如下:with open('your_file.csv', mode='r', encoding='utf-8') as csv_file: csv_reader = csv.reader(csv_file) # 如果有表头的话先跳过表头,没有就删掉这行 next(csv_reader) for row in csv_reader: # 假设visitor是第1列,guest是第2列,索引从0开始 visitor = row[0].strip() guest = row[1].strip() # 后面的逻辑和之前一样 combination_key = tuple(sorted((visitor, guest))) # ... rest of the code ... - 如果需要把匹配的行写入新CSV:可以添加这段代码在最后:
with open('matched_results.csv', mode='w', encoding='utf-8', newline='') as output_file: writer = csv.DictWriter(output_file, fieldnames=csv_reader.fieldnames) writer.writeheader() writer.writerows(matched_rows)
内容的提问来源于stack exchange,提问作者user7939708
相关产品推荐
相关产品推荐

