代码之家  ›  专栏  ›  技术社区  ›  tenticon

kdb q-嵌套列表中的查找

  •  5
  • tenticon  · 技术社区  · 7 年前

    如果一个原子位于一个值列表中,有没有一种通过原子值查找字典键的简洁方法?

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

    例子:

    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 回复  |  直到 7 年前
        1
  •  9
  •   Ryan McCarron    7 年前

    你可以利用 where 使用字典操作,并使用 in :

    where `jpm in/:d
    ,`fin
    

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

        2
  •  4
  •   geocar    7 年前

    你为什么要给自己制造麻烦?使用表格!

    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
    
        3
  •  2
  •   Jemma Borland    7 年前

    我想你可以利用 value & key 查找所需内容的关键字:

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

    希望有帮助!

    杰玛

        4
  •  1
  •   A. Henderson    7 年前

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

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

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

    [`msft`jpm`gs;d]

    输出:

    `tech`fin`fin