#kdb
Вопрос:
Допустим, у меня есть список:
d: 0w 1 2 3
Я хотел бы найти и заменить 0w
в списке. Я думал, что мог бы проиндексировать список, чтобы найти их, вернув список логических значений, с:
d . {x=0w}
но это не сработало.
Что я делаю не так? Как мне заменить свои 0w
» ы » на что-то более дружелюбное?
Ответ №1:
Если вы хотите найти индекс каждого 0w, вы можете сделать что-то вроде этого
where 0w=d
Затем, если вы хотите заменить все его экземпляры в d, скажем, на 4, вы можете сделать
d[where 0w=d]:4f
Просто следите за ошибками ввода при замене записи
Комментарии:
1. Это здорово, спасибо! Один вопрос: почему это
where
требуется во второй фразе? Этоd[0w=d]:4f
действительно приводит к неожиданному поведению, но я не могу понять, почему…2.
where
возвращает индексы истинных логических значений оператора справа. Однако kdb также будет интерпретироватьd[0w=d]
примерно так же, но на самом деле этоd[1000b]
так, поэтому он присваивает индексам 0 и 1 значение 4f.3. Использование оператора where покажет индекс в том месте, где выполняется предыдущее условие, поэтому в нашем случае только в 0, что все, что нам нужно. Просто 0w=d возвращает логический список, т. Е. 0 и 1, который возвращает только первую и вторую записи d.
Ответ №2:
Для нескольких замен вы можете также использовать словарь:
q)d:0W 1 2 3 q)remap:0W 2!0 22 q)d^remap d 0 1 22 3
перенесите 0W на 0 и перенесите 2 на 22