kdb+/q技术问询:双列表循环如何返回单一合并输出
Q语言字符串搜索结果合并问题
我正在对一个包含929个字符串的列表执行字符串搜索,同时循环遍历7个不同的搜索字符串。当前遇到的问题是,每个搜索字符串都会返回一组结果,总共返回7组,我希望将这些结果合并为单一输出,而非多次返回。
相关代码及输出如下:
q){{ss[x;y]}[;x]each exec rd from rdeFunc}each exec v from dToCol .. q)
q)count {{ss[x;y]}[;x]each exec rd from rdeFunc}each exec v from dToCol 7 q)
q)count each {{ss[x;y]}[;x]each exec rd from rdeFunc}each exec v from dToCol 929 929 929 929 929 929 929 q)
解决方案
1. 直接展平所有结果(合并成单一长列表)
如果只是需要把7组各929个的结果堆叠成一个连续列表,用raze函数展平嵌套结构即可:
q)raze {{ss[x;y]}[;x]each exec rd from rdeFunc}each exec v from dToCol
执行后count结果会是 7*929=6503,所有匹配结果被合并为单一列表。
2. 筛选匹配任意搜索字符串的原字符串
如果你的需求是找出原929个字符串中至少匹配7个搜索字符串之一的项,而非堆叠所有匹配结果,可以调整逻辑:先提取所有搜索字符串到一个列表,再对每个原字符串检查是否匹配任意搜索项:
q)// 先提取搜索字符串列表和目标字符串列表 q)searchVals:exec v from dToCol; q)targetRds:exec rd from rdeFunc; q)// 对每个目标字符串,检查是否匹配任意搜索项 q){any ss[searchVals;x]} each targetRds
这样返回的是一个长度为929的列表,每个元素为布尔值(1b/0b),对应原字符串是否匹配任意搜索项;如果需要提取匹配的原字符串,再套一层where:
q)targetRds where {any ss[searchVals;x]} each targetRds
内容的提问来源于stack exchange,提问作者bashprofile84
相关产品推荐
相关产品推荐

