Есть ли в KDB оператор `external` или` exclusive or`, эквивалентный `inter`? - PullRequest
3 голосов
/ 26 июня 2019

Допустим, у меня есть два следующих списка:

 x : `a`b`c`d;
 y : `a`b`e`f;

Для пересечения есть оператор inter:

q)x inter y
`a`b

Есть ли аналогичный оператор для выполненияEXCLUSIVE OR так, чтобы я получил:

q)x outer y
`c`d`e`f

?

Ответы [ 2 ]

9 голосов
/ 26 июня 2019

операция except даст вам элементы одного списка, которые не принадлежат другому.

Однако в вашем случае x except y даст только `c`d, а y except x даст только `e`f.

Поэтому вы можете использовать либо:

q)(x except y),y except x
`c`d`e`f

или

q)(x union y) except (x inter y)
`c`d`e`f

, либо, альтернативно, без использования except

q)where(count each group (distinct x), distinct y)=1
`c`d`e`f

, еслиВы хотите получить список всех эксклюзивных элементов.

С уважением, Кевин

5 голосов
/ 26 июня 2019

Из ответов Кевина, первый даст дубликаты, если они присутствуют в одном, последний даст отдельный список. Чтобы использовать инфикс функции, как вы запросили, вам нужно определить функцию в пространстве имен .q

q).q.outer:{(x union y) except (x inter y)}
q)x outer y
`c`d`e`f
...