Как заменить элементы в списке в KDB?

#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