如何让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 ) )
核心修改说明
- 封装单个字符串处理逻辑:将原递归计算逻辑封装为内部函数
_LEV_SINGLE,专注处理单个字符串对的距离计算,保留原算法的正确性。 - 数组输入兼容处理:
- 自动将非数组输入转为标准单列数组
- 通过
MAKEARRAY生成与跨组配对数量匹配的结果数组 - 利用索引遍历所有
a数组元素与b数组元素的配对,调用内部函数计算每个配对的距离
- 向后兼容:单个字符串输入时,函数仍能返回正确的单个距离值,例如
=LEV("book","back")依然返回2。
测试示例
输入:
=LEV(TEXTSPLIT("red ball"," "),TEXTSPLIT("yellow window"," "))
返回结果:
5 4 5 6
内容的提问来源于stack exchange,提问作者Ne Mo
相关产品推荐
相关产品推荐

