【问题标题】:Applying an operation on each element of nested list对嵌套列表的每个元素应用操作
【发布时间】:2018-05-26 11:14:59
【问题描述】:

我有一个复杂的嵌套列表(深度也可以>2):

p:((`g;`d1`d2);(`r;enlist `e1);(`r;enlist `p1))

如何为嵌套列表的每个元素添加一个元素但保留原始结构;例如将`h 添加到p 的每个元素,得到以下内容:

((`g`h;(`d1`h;`d2`h));(`r`h;enlist `e1`h);(`r`h;enlist `p1`h))

我试过了,但没有给出我想要的:

q)p,\:`h
((`g;`d1`d2;`h);(`r;enlist `e1;`h);(`r;enlist `p1;`h))

q)raze[p],\:`h
(`g`h;`d1`d2`h;`r`h;`e1`h;`r`h;`p1`h)

【问题讨论】:

    标签: kdb


    【解决方案1】:

    您可以使用.z.s 递归遍历嵌套列表,并且只将`h 附加到符号列表中:

    q){$[0=type x;.z.s'[x];x,\:`h]}p
    g    h    d1 h d2 h
    `r`h      ,`e1`h
    `r`h      ,`p1`h
    

    对于这个函数,我假设您的嵌套列表将只包含符号。它检查列表的类型,如果它不是混合列表,则将`h 附加到每个元素。如果它是一个混合列表,那么它将该列表的每个元素分别传递回函数以再次检查。

    【讨论】:

      【解决方案2】:

      虽然不是递归的(因此需要一些有关嵌套列表形状的知识),但更传统的方法是

      q).[p;2#(::);,';`h]
      g    h    d1 h d2 h
      `r`h      ,`e1`h
      `r`h      ,`p1`h
      

      【讨论】:

        【解决方案3】:

        虽然托马斯已经回答了这个问题;如果您想指定除append 之外的任何其他操作,您可以使用以下内容:

        q)f:{`$ "_" sv string x,y}
        
        q){[o;a;e] $[-11<>type e; .z.s [o;a] each e; o[e;a]] }[f;`h] each p
        `g_h `d1_h`d2_h
        `r_h ,`e1_h
        `r_h ,`p1_h
        

        或者当f被分配为append操作时

        q)f:{x,y}
        q){[o;a;e] $[-11<>type e; .z.s [o;a] each e; o[e;a]] }[f;`h] each p
        g    h    d1 h d2 h
        `r`h      ,`e1`h
        `r`h      ,`p1`h
        

        【讨论】:

          猜你喜欢
          • 2020-01-05
          • 2021-01-20
          • 2019-12-25
          • 2021-01-13
          • 2021-07-21
          • 1970-01-01
          • 1970-01-01
          • 2017-02-08
          • 1970-01-01
          相关资源
          最近更新 更多