Python实现无零无重复三维序列笛卡尔积并导出CSV
解决生成指定CSV文件的问题
需求回顾
需要生成一个CSV文件,满足:
- 两列均为由±1、±2、±3组成的三元组(无0),同一列内不存在多重集重复的三元组(如
[3,1,3]与[3,3,1]视为重复,仅保留一个) - 第一列从
[3,3,3]遍历到[-3,-3,-3],覆盖所有符合要求的三元组 - 第一列的每个三元组对应第二列的所有符合要求的三元组,形成笛卡尔积
修正后的Python代码
import csv from itertools import product # 定义所有允许的元素(排除0) elements = [-3, -2, -1, 1, 2, 3] # 生成所有可能的有序三元组 all_ordered_triples = product(elements, repeat=3) # 去重:通过排序三元组,将同一多重集的不同有序形式合并为一个唯一代表 unique_multisets = list({tuple(sorted(triple, reverse=True)) for triple in all_ordered_triples}) # 按要求排序:从[3,3,3]到[-3,-3,-3] sorted_triples = sorted(unique_multisets, key=lambda x: (-x[0], -x[1], -x[2])) # 生成所有三元组对(笛卡尔积) all_pairs = product(sorted_triples, sorted_triples) # 写入CSV文件 with open('triple_pairs.csv', 'w', newline='', encoding='utf-8') as csvfile: writer = csv.writer(csvfile) # 写入表头 writer.writerow(['第一列三元组', '第二列三元组']) # 遍历所有对,格式化为字符串后写入 for tri1, tri2 in all_pairs: tri1_str = f"[{', '.join(map(str, tri1))}]" tri2_str = f"[{', '.join(map(str, tri2))}]" writer.writerow([tri1_str, tri2_str])
代码说明
- 元素过滤:明确使用
[-3,-2,-1,1,2,3],彻底排除0元素,符合需求 - 去重逻辑:通过将每个三元组按降序排序后存入集合,自动去除多重集重复的三元组,最终得到56个唯一的多重集三元组
- 排序规则:使用
(-x[0], -x[1], -x[2])作为排序键,确保三元组从(3,3,3)开始,到(-3,-3,-3)结束,完全匹配遍历顺序要求 - 笛卡尔积生成:利用
itertools.product生成第一列与第二列的所有组合,最终生成56*56=3136行数据(含表头)
数据量调整说明
按照需求中的多重集去重规则,唯一三元组共56个,总数据量为3136行。若您实际需要保留所有有序三元组(不排除多重集重复),只需移除去重步骤,直接对all_ordered_triples排序即可,此时总数据量为6^3×6^3=46656行。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

