You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成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')
[...]

期望效果

  1. 同一输出行中不包含同一分类(列)的多个元素
  2. 移除输出中的括号、引号和逗号,以空格分隔组合元素

期望输出示例:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:35:26