对嵌套列表的每个元素应用操作
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
我有一个复杂的嵌套列表(深度也可以>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