【问题标题】:kdb q - lookup in nested listkdb q - 在嵌套列表中查找
【发布时间】:2018-02-12 14:11:09
【问题描述】:

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

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

例子:

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

最后一个选项不能很好地随着键的数量而扩展

谢谢!

【问题讨论】:

    标签: kdb q-lang


    【解决方案1】:

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

    where `jpm in/:d
    ,`fin
    

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

    【讨论】:

      【解决方案2】:

      你为什么要让自己这么难?使用一张桌子!

      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】:

        我认为您可以利用 valuekey 关键字来找到您想要的东西:

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

        希望有帮助!

        杰玛

        【讨论】:

        • 可以使用 each 权限来加快速度,但不那么可读:key[d] where `jpm in/: value d
        【解决方案4】:

        到目前为止,您收到的答案非常好。这是我在 Ryan 的回答基础上做出的贡献:

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

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

        [`msft`jpm`gs;d]

        输出:

        `tech`fin`fin

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多