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

求解可变维度n*m数组排除零值的所有有效组合方案

可变维度数组无零值组合生成方案

核心要求

  • 输入:n列m行的任意尺寸数组
  • 生成规则:每列选取且仅选取1个行对应元素,枚举所有可能组合
  • 过滤规则:排除任意位置包含零值的组合

示例:2行3列数组,若第1行第2列(Item2)为零,需排除所有用到该单元格的4种组合,最终保留4种有效组合:AEC、AEF、DEC、DEF

实现代码

1. Excel VBA 实现(适配宏使用场景)

可直接在Excel中运行,支持选中任意输入区域,提前过滤每列零值避免无效计算,结果自动输出到指定区域:

Sub GenerateValidCombinations()
    Dim inputRng As Range, outputCell As Range
    Dim arr As Variant, colVals As Object, colCount As Long, rowCount As Long
    Dim result As Collection, tempComb As Variant, i As Long, j As Long
    
    ' 选中输入数组区域
    Set inputRng = Application.InputBox("请选择输入数组区域(不含表头)", Type:=8)
    arr = inputRng.Value
    colCount = UBound(arr, 2)
    rowCount = UBound(arr, 1)
    
    ' 存储每列非零值
    Set colVals = CreateObject("Scripting.Dictionary")
    For j = 1 To colCount
        colVals.Add j, New Collection
        For i = 1 To rowCount
            If arr(i, j) <> 0 And arr(i, j) <> "" Then
                colVals(j).Add arr(i, j)
            End If
        Next i
        ' 某列无非零值直接退出,无有效组合
        If colVals(j).Count = 0 Then
            MsgBox "第" & j & "列无有效非零值,无符合要求的组合", vbExclamation
            Exit Sub
        End If
    Next j
    
    ' 递归生成组合
    Set result = New Collection
    ReDim tempComb(1 To colCount)
    Call RecurseCombinations(colVals, 1, colCount, tempComb, result)
    
    ' 输出结果
    Set outputCell = Application.InputBox("请选择结果输出起始单元格", Type:=8)
    For i = 1 To result.Count
        outputCell.Offset(i - 1, 0).Resize(1, colCount) = result(i)
    Next i
End Sub

' 递归生成组合子过程
Private Sub RecurseCombinations(colVals As Object, curCol As Long, maxCol As Long, tempComb As Variant, result As Collection)
    Dim val As Variant
    For Each val In colVals(curCol)
        tempComb(curCol) = val
        If curCol = maxCol Then
            ' 已到最后一列,保存组合
            result.Add tempComb
        Else
            ' 递归处理下一列
            Call RecurseCombinations(colVals, curCol + 1, maxCol, tempComb, result)
        End If
    Next val
End Sub

2. Python 实现(通用数据处理场景)

通过标准库itertools快速实现,适配任意数组格式输入:

from itertools import product

def get_valid_combinations(arr):
    # 提取每列的非零值
    col_non_zero = []
    for col in zip(*arr):
        non_zero = [v for v in col if v != 0]
        if not non_zero:
            return []
        col_non_zero.append(non_zero)
    # 生成所有组合返回,字符串拼接可根据需求调整为列表返回
    return [''.join(comb) for comb in product(*col_non_zero)]

# 示例测试
test_arr = [
    ['A', 0, 'C'],
    ['D', 'E', 'F']
]
print(get_valid_combinations(test_arr))
# 输出:['AEC', 'AEF', 'DEC', 'DEF']

内容的提问来源于stack exchange,提问作者Anton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:18:02