对嵌套列表的每个元素应用操作

Applying an operation on each element of nested list

我有一个复杂的嵌套列表(深度也可以>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)

您可以使用 .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 附加到每个元素。如果它是一个混合列表,则它将该列表的每个元素分别传递回函数以再次检查。

虽然托马斯已经回答了这个问题;如果您想指定除 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

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

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