Я хочу выполнить замену строкового поиска в списке, но в списке есть элементы разных размеров, поэтому это более сложно.
q)d1
"['null', 'work']"
"['verse']"
"['hi', 'fire']"
"['null']"
"['null', 'echo']"
"['pause']"
"['null', 'hi']"
"['null', 'cheek']"
"['lamb', 'null']"
q)fargs
"w"
"h"
"f"
"s"
"a"
q)sargs
"help"
"yes"
"no"
"why"
"when"
Текущая попытка
{{ssr[x;y;z]}[x;;]'[fargs;sargs]}each d1
Я ожидаю, что d1 вернет именно так, как он выглядит, с заменой любых слов в саргах любыми буквами в фаргах.
Как лучше всего подойти к этой проблеме?
Не совсем ясно, каков желаемый результат, но это реализация, которая заменяет каждое вхождение fargs
соответствующим значением в sargs
.
q)ssr/[;fargs;sargs]each d1
"['null', 'yewhyelpork']"
"['verwhye']"
"['yewhyi', 'noire']"
"['null']"
"['null', 'ecyewhyo']"
"['pwhenuwhye']"
"['null', 'yewhyi']"
"['null', 'cyewhyeek']"
"['lwhenmb', 'null']"
Обратите внимание, что это делается последовательно, т. е. после одной замены, если введены какие-либо буквы из fargs
, их можно заменить позже. Мы можем увидеть это, используя scan
(\
) вместо over
(/
):
q)ssr\[;fargs;sargs]first d1
"['null', 'helpork']"
"['null', 'yeselpork']"
"['null', 'yeselpork']"
"['null', 'yewhyelpork']"
"['null', 'yewhyelpork']"
Оказывается, эта простая задача намного сложнее, если вам не нужны рекурсивные/последовательные замены, как указано в ответе Киллиана. Если вам нужны замены только на начальном верхнем уровне, то может сработать что-то вроде этого (может быть и более простой способ, который я упускаю из виду):
q)d1:("['null', 'work']";"['verse']";"['hi', 'fire']";"['null']";"['null', 'echo']";"['pause']";"['null', 'hi']";"['null', 'cheek']";"['lamb', 'null']");
q)fargs:"whfsa"
q)sargs:("help";"yes";"no";"why";"when")
q)toplevelSSR:{$[null 1+m:min raze i:ss[x]each y;x;raze@[;1;.z.s[;y;z]]@[;0;'[raze;ssr[;y s;z s]]]cut[0,m+count y s:first where m in/:i;x]]};
q)toplevelSSR[;fargs;sargs]each d1
"['null', 'helpork']"
"['verwhye']"
"['yesi', 'noire']"
"['null']"
"['null', 'ecyeso']"
"['pwhenuwhye']"
"['null', 'yesi']"
"['null', 'cyeseek']"
"['lwhenmb', 'null']"
Чтобы продолжить ответ Терри, это более простая замена только верхнего уровня:
q){raze@[s;i;:;x i:where""~/:s:z y?x]}[;fargs;sargs]each d1
"['null', 'helpork']"
"['verwhye']"
"['yesi', 'noire']"
"['null']"
"['null', 'ecyeso']"
"['pwhenuwhye']"
"['null', 'yesi']"
"['null', 'cyeseek']"
"['lwhenmb', 'null']"
Хороший. Обратите внимание, что это будет работать (на данный момент) только для односимвольных фаргов, как в этом примере. Скажем, это не сработало бы fargs:("wo";"h";"f";"s";"a")
Можете ли вы передать данные в другом формате (например, JSON), который позволит вам более эффективно перебирать записи?