如何生成CSV文件各分类列间的所有有效单词组合?
问题:生成CSV列间的所有有效组合
需要处理一个CSV文件,每列对应一个单词分类,目标是生成列间的所有可能组合。测试用简化CSV如下:
$ cat file.csv Color,Pet,Action black,dog,barks brown,cat,runs white,bird,flies ,hamster, red,,swims
可以看到部分列的单词数量不一致(比如颜色列条目可能多于宠物列,或反之)。
当前代码及问题
当前代码尝试用itertools.product生成组合,但逻辑错误,导致输出包含同一列的多个元素:
import csv import itertools with open('file.csv', newline='') as csvfile: next(csvfile, None) #skip header row data = list(csv.reader(csvfile)) for combination in itertools.product(*data): print(combination)
当前错误输出示例:
$ python3 combiner.py ('black', 'brown', 'white', '', 'red') ('black', 'brown', 'white', '', '') ('black', 'brown', 'white', '', 'swims') ('black', 'brown', 'white', 'hamster', 'red') [...]
期望效果
- 同一输出行中不包含同一分类(列)的多个元素
- 移除输出中的括号、引号和逗号,以空格分隔组合元素
期望输出示例:
black black dog black dog barks black dog runs black dog flies black dog swims black cat black cat barks [...] black hamster black hamster flies [...] red dog runs [...]
高效解决方案
核心思路是按列提取非空元素,再生成列间的笛卡尔积,覆盖单个列、多列组合的所有情况:
import csv import itertools # 读取CSV并按列提取非空元素 columns = [] with open('file.csv', newline='') as csvfile: reader = csv.reader(csvfile) next(reader) # 跳过表头 # 转置数据,将行转为列 transposed_data = zip(*reader) for col in transposed_data: # 过滤空字符串,同时去除元素前后空格 non_empty_items = [item.strip() for item in col if item.strip()] columns.append(non_empty_items) # 拆分各列的元素列表 colors, pets, actions = columns # 生成并输出所有有效组合 # 1. 单个颜色 for color in colors: print(color) # 2. 颜色 + 宠物 for color, pet in itertools.product(colors, pets): print(f"{color} {pet}") # 3. 颜色 + 宠物 + 动作 for color, pet, action in itertools.product(colors, pets, actions): print(f"{color} {pet} {action}") # (可选)如果需要颜色+动作的组合,取消下面注释 # for color, action in itertools.product(colors, actions): # print(f"{color} {action}") # (可选)如果需要单个宠物、宠物+动作、单个动作,取消下面注释 # for pet in pets: # print(pet) # for pet, action in itertools.product(pets, actions): # print(f"{pet} {action}") # for action in actions: # print(action)
说明
- 先通过
zip(*reader)转置数据,把每列的元素提取出来,过滤掉空值,确保每个列的列表只包含有效单词 - 用
itertools.product生成多列的笛卡尔积,保证每行是不同列的元素组合 - 按需求分层次输出不同长度的组合,格式直接用字符串拼接实现无符号输出
内容的提问来源于stack exchange,提问作者IlChengis
相关产品推荐
相关产品推荐

