替换列表中与KDB Q中的子字符串不匹配的元素

Car*_*ein 3 kdb

我将如何遍历KDB Q中的列表并替换不符合某些子字符串条件的元素?

逻辑示例伪代码:

list.stream()
    .forEach(x -> {
        if (x matches substring) :
            newList.add(x)
        else :
            newList.add("")
     })
Run Code Online (Sandbox Code Playgroud)

当前列表:

S: ("Lint"; "Stack"; "Linode"; "Overflow";"Linux")
Run Code Online (Sandbox Code Playgroud)

要匹配的子字符串在"Li"这里。这样,字符串“ Stack”和“ Overflow”被空字符串替换,因为它们不包含子字符串。

结果列表:

S: ("Lint"; ""; "Linode"; "";"Linux")
Run Code Online (Sandbox Code Playgroud)

Mic*_*and 5

您可以通过几种方法进行处理。首先使用如下条件评估遍历每个元素:

q){$[x like "Li*";x;" "]}each S
"Lint"
" "
"Linode"
" "
"Linux"
Run Code Online (Sandbox Code Playgroud)

或使用at应用,如下所示:

q)@[S;where not S like\: "Li*";:;" "]
"Lint"
" "
"Linode"
" "
"Linux"
Run Code Online (Sandbox Code Playgroud)

  • 我想您想将`“”`设置为默认值,而不是`“”`,否则您将混合使用类型 (3认同)
  • 不需要像在第二种情况下那样使用each-left(\ :),就像已经遍历列表一样。 (3认同)

ter*_*nch 5

条件向量也可以工作:

q)?[S like "Li*";S;count[S]#enlist ""]
"Lint"
""
"Linode"
""
"Linux"
Run Code Online (Sandbox Code Playgroud)