Я выполняю поиск по 929 строкам в списке.
Я перебираю 7 разных строк.
Проблема, с которой я сталкиваюсь, заключается в том, как вернуть вывод как один, а не возвращать его 7 раз для каждой искомой строки.
q){{ss[x;y]}[;x]each exec rd from rdeFunc}each exec v from dToCol
..
q)
q)count {{ss[x;y]}[;x]each exec rd from rdeFunc}each exec v from dToCol
7
q)
q)count each {{ss[x;y]}[;x]each exec rd from rdeFunc}each exec v from dToCol
929 929 929 929 929 929 929
q)
@rianoc это просто стандарт ss
, поэтому он вернет первый индекс, в котором строки из exec v from dToCol
найдены в строках exec rd from rdeFunc
, или, если не найдены, вернет значение null
для этой строки
return the output as one
как вы хотите агрегировать данные с 7 до 1? count
? raze
? any
? Является ли результат одним списком логических значений? Вложенный список длинных значений?
@rianoc Я хочу убедиться, что у меня есть все строки с индексами, то есть там, где было найдено совпадение, а затем в оставшихся строках, где совпадений не было найдено в 7 циклах, просто верните ноль. Итак, я думаю, я почти хочу объединить 7 выходных данных в один, где индекс (число) перезаписывает нулевое значение, а остальные нули остаются прежними. lj
вот что я думаю
Образец данных:
dToCol:([] v:("aa";"cc";"ff"))
rdeFunc:([] rd:("aa";"bb";"cc";"dd";"ee";"ff"))
Ваш код дает 3 списка из 6:
q)count each {{ss[x;y]}[;x]each exec rd from rdeFunc}each exec v from dToCol
6 6 6
Если вам нужно 6 списков из 3, вы можете использовать flip
:
count each flip {{ss[x;y]}[;x]each exec rd from rdeFunc}each exec v from dToCol
3 3 3 3 3 3
Или измените порядок запроса, чтобы flip
не требовался:
count each {ss[x] each exec v from dToCol}each exec rd from rdeFunc
3 3 3 3 3 3
Или используйте \:/:
каждый слева каждый справа, чтобы еще больше упростить:
https://code.kx.com/q/ref/maps/#left-right-cross
count each ss\:/:[dToCol`v;rdeFunc`rd]
3 3 3 3 3 3
Убедитесь, что все результаты точно совпадают:
r3:ss\:/:[dToCol`v;rdeFunc`rd]
r2:{ss[x] each exec v from dToCol}each exec rd from rdeFunc
r1:flip {{ss[x;y]}[;x]each exec rd from rdeFunc}each exec v from dToCol
r1~r2
1b
r2~r3
1b
Я бы потребовал, чтобы возвращался сам индекс, а не просто логический ответ. Итак, после объединения это будет выглядеть так, как показано ниже ,0 ,0 ,0
я собираюсь использовать индексы, чтобы затем извлечь строку из каждой строки, в которой было найдено совпадение.
Добавил {x where count each x}
пример, чтобы не возвращать пустую посуду.
q){{x where count each x}{ss[x;y]}[;x]each exec rd from rdeFunc}each exec v from dToCol () (,22;,22;,22;,22;,22) (,17;,17;,17;,17;,17) (,26;,26;,26;,26;,26;,26;,26;,26;,26;,20;,20;,20;,20;,20;,20;,20;,20;,20;,20;,20;,18;,18;,18;,18;,18;,18;,18;,18;,18;,18;,18;,18) (,23;,23;,23;,23;,23;,23;,23;,23;,23;,23;,23;,23;,23;,35;,35;,35;,35;,35;,35;,35;,35) (,37;,37;,37;,37;,37;,37;,37;,37;,37;,37;,37;,37;,37;,37;,29;,29;,29;,29;,29;,29;,29;,29;,29;,29;,29;,29;,29;,38;,38;,38;,38;,38;,38;,38;,40;,40;,40;,40;,40;,40;,40) (,48;,48;,48;,48)
Кажется, он не возвращает значения null
или строку, в которой находится каждый индекс. Если включить значения null
для каждого возврата выше (так что для каждого будет возвращено 929 элементов), тогда я смогу увидеть положение каждой строки, содержащей совпадение. У меня есть индексы, но я понятия не имею, какой строке они соответствуют.
Да, именно поэтому я до сих пор не уверен, почему вы недовольны первоначальным результатом. Там есть вся необходимая информация. Эти попытки агрегировать или изменить форму приведут к потере информации. Если все, что вам нужно, это flip
исходный результат?
Ааа, я вижу, что простой переворот приводит к желаемому результату, с которым я могу работать. большое спасибо за ваше время и помощь
Я улучшил ответ, теперь понятно, чего хотелось. Если вы сможете включить небольшой образец входных данных и желаемый результат в будущем, это значительно облегчит ответы на вопросы.
Можете ли вы дать образец с некоторыми данными? и подробнее изучить форму и тип данных, которые вы хотите получить в результате? Непонятно, чего вы ожидаете в результате.