Применение операции к каждому элементу вложенного списка - PullRequest
0 голосов
/ 26 мая 2018

У меня сложный вложенный список (глубина также может быть> 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)

Ответы [ 3 ]

0 голосов
/ 26 мая 2018

Хотя Томас уже ответил на вопрос;Если вы хотите указать любую другую операцию, кроме 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
0 голосов
/ 29 мая 2018

Хотя это и не является рекурсивным (и поэтому требует определенных знаний о форме вашего вложенного списка), более традиционный подход будет

q).[p;2#(::);,';`h]
g    h    d1 h d2 h
`r`h      ,`e1`h
`r`h      ,`p1`h
0 голосов
/ 26 мая 2018

Вы можете использовать .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 к каждому элементу.Если это смешанный список, он передает каждый элемент этого списка обратно в функцию отдельно для повторной проверки.

...