将字典连接到字符串的最干净的方法?

Cleanest way of joining a dictionary to a string?

假设我有

k: `a`b`c
v: 1 2 3

我们如何制作以下形式的字符串:

a=1&b=2&c=3

以下 lambda 可以完成您想要的(接受字典作为其参数):

{"&" sv "=" sv/: string flip (key;value)@\:x} `a`b`c!1 2 3

这是非常具体的情况,但如果您只是为了“显示”目的而这样做,那么您可以使用内置的 .Q.s

q)ssr/[-2_.Q.s d;("| ";"\r\n");("=";"&")]
"a=1&b=2&c=3"

虽然输出会受到控制台大小的限制,因此出于所有实际目的,您 would/should 使用 kylebonnes 答案。

编辑:.Q.s2 让你也很接近:

q)"&"sv"="^.Q.s2 d
"a|=1&b|=2&c|=3"

EDIT2:根据您进一步披露的目的是构建查询字符串,然后我还有一些其他评论:

  1. 您很可能需要逗号 , 而不是 &。您通常不应在查询的 where 子句中使用 &
  2. 如果你的字典值中有符号,我的和 kylebonnes 的解决方案都不适合你,例如
d:`a`b`c!`one`two`three

并且您正在尝试构建一个查询

where a=`one,b=`two,c=`three

在这种情况下,您必须尝试使用​​ maybe .Q.s1 或有逻辑来放置反引号。

  1. 另一种方法可能是构建查询的函数形式,但您仍然会遇到类似的问题
q)"?[t;",(-3!{(=;x;d x)}each key d),";0b;()]"
"?[t;((=;`a;1);(=;`b;2);(=;`c;3));0b;()]"
  1. 最终,制造复杂的查询字符串以发送到 kdb 服务器并不是一个好的做法。你能把你想要的查询包装成一个函数并在服务器上定义这个函数吗?然后你的 URL 只需要调用这个函数。为什么不能向 kdb 服务器发送直接同步调用,例如
h:hopen`::1234;
h({<function to generate query without having to string>};`a`b`c!1 2 3)