许多功能语言都内置了filter列表中元素的方法。除非我缺少任何东西,否则Q似乎没有任何此类内置方法。令我惊讶的是,过滤器是这么多函数语言中最常用的高级函数。
假设我要过滤掉列表1 0 2 3 0 4中的所有0。过滤后的结果列表应该是1 2 34。我目前在Q中通过执行以下操作来实现这一点:
raze{eval(?;(not;(=;x;0));x;())}peach 1 0 2 3 0 4
这给了我所需的结果,但是在确定所有正在发生的事情都是过滤器时,阅读起来有点不方便。
我可以据此创建自己的过滤器功能,但是我想知道是否缺少某些内容。语言中是否有常规的方法来过滤Q?
答案 0 :(得分:5)
except
应该是您要查找的关键字。
来自http://code.kx.com/q/ref/select/#except:
返回列表x(不是列表项)或原子y的所有列表项。
q)1 0 2 3 0 4 except 0
1 2 3 4
答案 1 :(得分:1)
有一些由Aaron Davies编写的过滤器功能实现,可能对不同的用例有用。
https://github.com/adavies42/qist/blob/c4840d8b072ff23b05f38aef9ab0a8298a16d902/lib/util.q#L147:1
一个例子:
q)filter [1 <] 1 2 3 输出:2 3
答案 2 :(得分:0)
如果要使用通配符进行模式搜索,则可能要使用like
。
例如获取所有以6
结尾的元素
q)l2:("a01";"b02";"c03";"f06";"z26")
q)l2 where l2 like "*6"
("f06";"z26")
说明:
1)搜索以6
结尾的字符串; like
将返回一个布尔向量
q)l2 like "*6"
00011b
2)现在获取索引where
,向量元素为true
q)where l2 like "*6"
3j, 4j
3)获取找到匹配项的元素
q)l2 where l2 like "*6"
("f06";"z26")