如何用Python实现多列表的组合运算(含拼接、加减乘操作)?
问题需求
现有三个列表:
a = ['a',2225, 0.063, 29.31] b = ['b',5000, 0.072, 109] c = ['c',6500, 0.051, 70]
需要生成所有非空子集组合,组合规则如下:
- 第0列:对应列表名称拼接
- 第1列:对应数值相加
- 第2列:对应数值相乘
- 第3列:对应数值相加
预期输出:
['a',2225, 0.063, 29.31] ['b',5000, 0.072, 109] ['c',6500, 0.051, 70] ['ab', 7225, 0.0045, 138.31] ['ac', 8725, 0.0032, 99.31] ['bc', 11500, 0.0036, 179] ['abc', 13725, 0.0002, 208.31]
解决方案
可以用Python的itertools.combinations生成所有非空子集,再对每个子集按规则计算对应值,代码实现如下:
import itertools # 将列表名称与对应数值部分关联,方便后续处理 data = [('a', [2225, 0.063, 29.31]), ('b', [5000, 0.072, 109]), ('c', [6500, 0.051, 70])] # 遍历所有非空子集的大小:从1个元素到全部3个元素 for size in range(1, len(data)+1): # 生成当前大小的所有组合 for combo in itertools.combinations(data, size): # 拼接名称(第0列) name = ''.join(item[0] for item in combo) # 计算第1列:数值求和 col1 = sum(item[1][0] for item in combo) # 计算第2列:数值相乘 col2 = 1.0 for item in combo: col2 *= item[1][1] # 计算第3列:数值求和 col3 = sum(item[1][2] for item in combo) # 调整小数位数,匹配预期输出格式 result = [ name, col1, round(col2, 4), round(col3, 2) if isinstance(col3, float) else col3 ] print(result)
代码说明
- 先把每个列表的名称和对应的数值段打包成元组,避免混淆名称和计算值
- 用
itertools.combinations生成不同长度的子集组合,确保覆盖所有非空情况 - 按规则分别计算四个列的值:
- 名称直接用字符串拼接
- 第1、3列用
sum函数直接求和 - 第2列通过循环累乘得到结果
- 最后对小数结果做四舍五入,和预期输出的格式保持一致
内容的提问来源于stack exchange,提问作者ben121
相关产品推荐
相关产品推荐

