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

Например, у меня есть:

x: (`a`b!(1;2); (); `a`b!(3;4))

и я хочу удалить (). Я пытался использовать ? (совпадение)

x[x ? not ()]

но это просто дает ().

Какое правильное выражение?

Фон

Я часто использую peach для выполнения серии запросов, и часто некоторые из них возвращают недостающие данные в виде (). Следовательно, я хочу удалить () и вернуться к хорошему столу.


person mchen    schedule 17.04.2014    source источник


Ответы (4)


Вы также можете использовать, кроме:

q)x except 1#()
a b
---
1 2
3 4
person WooiKent Lee    schedule 17.04.2014

Ну, если вы уже возвращаете таблицы (а не словари), вы всегда можете просто raze и этого будет достаточно, чтобы избавиться от пустого списка. Технически он добавляется, но если вы добавляете пустой список к списку, вы получаете исходный список. Напомним, что таблица — это просто список словарей, так что и здесь это так.

//I'm enlisting your dictionaries,
//so that they become tables and then raze
q)raze @[x; 0 2; enlist]   
a b
---
1 2
3 4

Фрагменты, такие как raze f each x или raze f peach x, очень распространены, и я подозреваю, что это идиома, которая лучше всего подойдет для вашего случая использования.

person JPC    schedule 21.04.2014

() — пустой список. Таким образом, он имеет нулевой счет. Поэтому мы можем использовать:

q)x where not 0 = count each x
a b
---
1 2
3 4
person jgleeson    schedule 17.04.2014

Немного более общий способ избавиться от нежелательных элементов:

q)x where not x~\:()
a b
---
1 2
3 4

q)x where not x~\:`a`b!(1;2)
()
`a`b!3 4
person nyi    schedule 02.09.2018