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

如何让Levenshtein距离LAMBDA函数支持数组输入并跨数组对比

解决Excel LAMBDA实现Levenshtein距离函数的数组输入兼容问题

修改后的兼容数组输入的LEV函数

=LAMBDA(a,b,
    LET(
        -- 内部递归函数:处理单个字符串对的Levenshtein距离
        _LEV_SINGLE, LAMBDA(x,y,
            LET(
                lev_recurse, LAMBDA(x,y,ii,jj,arr,
                    LET(
                        i, IF(ISOMITTED(ii), 1, ii),
                        j, IF(ISOMITTED(jj), 1, jj),
                        x_i, MID(x, i, 1),
                        y_j, MID(y, j, 1),
                        init_array, MAKEARRAY(LEN(x)+1, LEN(y)+1, LAMBDA(r,c,IFS(r=1,c-1,c=1,r-1,TRUE,0))),
                        cost, N(NOT(x_i=y_j)),
                        this_arr, IF(ISOMITTED(arr), init_array, arr),
                        option_a, INDEX(this_arr, i, j+1)+1,
                        option_b, INDEX(this_arr, i+1, j)+1,
                        option_c, INDEX(this_arr, i, j)+cost,
                        new_val, MIN(option_a, option_b, option_c),
                        overlay, MAKEARRAY(LEN(x)+1, LEN(y)+1, LAMBDA(r,c,IF(AND(r=i+1,c=j+1), new_val, 0))),
                        new_arr, this_arr + overlay,
                        new_i, IF(i=LEN(x), IF(j=LEN(y), i+1, 1), i+1),
                        new_j, IF(i<>LEN(x), j, IF(j=LEN(y), j+1, j+1)),
                        is_end, AND(new_i>LEN(x), new_j>LEN(y)),
                        IF(is_end, new_val, lev_recurse(x,y,new_i,new_j,new_arr))
                    )
                ),
                lev_recurse(x,y)
            )
        ),
        -- 处理数组输入,生成所有跨组配对的结果
        a_arr, IF(ISARRAY(a), a, HSTACK(a)),
        b_arr, IF(ISARRAY(b), b, HSTACK(b)),
        a_count, ROWS(a_arr),
        b_count, ROWS(b_arr),
        result, MAKEARRAY(a_count*b_count, 1, LAMBDA(k,
            LET(
                a_idx, INT((k-1)/b_count)+1,
                b_idx, MOD(k-1, b_count)+1,
                _LEV_SINGLE(INDEX(a_arr,a_idx), INDEX(b_arr,b_idx))
            )
        )),
        result
    )
)

核心修改说明

  1. 封装单个字符串处理逻辑:将原递归计算逻辑封装为内部函数_LEV_SINGLE,专注处理单个字符串对的距离计算,保留原算法的正确性。
  2. 数组输入兼容处理:
    • 自动将非数组输入转为标准单列数组
    • 通过MAKEARRAY生成与跨组配对数量匹配的结果数组
    • 利用索引遍历所有a数组元素与b数组元素的配对,调用内部函数计算每个配对的距离
  3. 向后兼容:单个字符串输入时,函数仍能返回正确的单个距离值,例如=LEV("book","back")依然返回2。

测试示例

输入:

=LEV(TEXTSPLIT("red ball"," "),TEXTSPLIT("yellow window"," "))

返回结果:

5
4
5
6

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 01:09:53