如何遍历n维列表实现任意数量骰子的全组合点数求和
解法1:使用Python标准库itertools.product(推荐)
itertools.product原生支持生成多个可迭代对象的笛卡尔积,可直接适配任意数量的骰子场景,代码改写字数少、逻辑清晰:
import itertools dice = [4,6,8] # 支持任意长度的面数列表,比如示例为1个4面、1个6面、1个8面骰子 rawDiceOutcomes = [] finalOutcomes = [] # 生成每个骰子的可选点数列表 for face in dice: rawDiceOutcomes.append([i for i in range(1, face+1)]) # 生成所有点数组合并求和 for outcome_tuple in itertools.product(*rawDiceOutcomes): finalOutcomes.append(sum(outcome_tuple))
代码里的*是解包操作,会把n个骰子的点数列表作为参数逐个传入itertools.product,自动生成所有可能的点数组合,每个组合以元组返回,直接求和即可,哪怕传入100个骰子的面数参数也能正常处理。
解法2:手动实现累积迭代(无第三方依赖)
如果不想引入标准库,可以用逐层累积的逻辑实现,每加入一个骰子就和当前已有的求和结果做二次组合,遍历完所有骰子就能得到最终结果:
dice = [4,6,8] finalOutcomes = [0] # 初始值代表0个骰子时和为0 for face in dice: temp = [] # 已有求和结果和新骰子的每个点数相加,得到更新后的求和列表 for current_sum in finalOutcomes: for point in range(1, face+1): temp.append(current_sum + point) finalOutcomes = temp
该方法逻辑简单易读,不需要依赖任何额外库,同样支持任意数量的骰子输入。
内容的提问来源于stack exchange,提问作者Opti_byte
相关产品推荐
相关产品推荐

