kdb q - 在嵌套列表中查找

时间:2018-02-12 14:11:09

标签: kdb q-lang

如果原子在值列表中,是否有一种用原子值查找字典键的简洁方法?

假设:字典的值列表具有每个唯一元素

示例:

d:`tech`fin!(`aapl`msft;`gs`jpm) / would like to get key `fin by looking up `jpm
d?`gs`jpm / returns `fin as expected
d?`jpm    / this doesn't work unfortunately
$[`jpm in d`fin;`fin;`tech] / this is the only way I can come up with

最后一个选项无法很好地扩展键数

谢谢!

4 个答案:

答案 0 :(得分:9)

您可以利用where对词典的操作方式,并使用in

where `jpm in/:d
,`fin

请注意,这将返回一个列表,因此如果您想要复制上面的内容,可能需要在输出上执行first

答案 1 :(得分:4)

为什么你自己这么难?使用表格!

q)t:([] c:`tech`tech`fin`fin; sym:`aapl`msfw`gs`jpm)
q)first exec c from t where sym=`jpm

当然可以做你要求的事情:

first where `jpm in'd

但是这种方法并没有很好地扩展到向量,而表格方法确实如此!

q)exec c from t where sym in `jpm`gs

答案 2 :(得分:2)

我认为你可以利用value& key个关键字可以找到您所追求的内容:

q)key[d]where any value[d]in `jpm
,`fin

希望有所帮助!

杰马

答案 3 :(得分:1)

到目前为止,您收到的答案非常好。这是我对Ryan答案的贡献:

{[val;dict]raze {where y in/:x}[dict]'[val]}[`msft`jpm`gs;d]

主要区别在于您可以传递要评估的值列表,结果将是键列表。

[`msft`jpm`gs;d]

输出:

`tech`fin`fin