?
Find¶
Find the first occurrence of an item in a list.
x?y ?[x;y]
where x
is a list or a null, returns for
- atom
y
the smallest index ofy
- list
y
the smallest index of each item ofy
Where y
or an item of it is not found in x
, the smallest index is the smallest integer not found in key x
, i.e. count x
. Comparisons are exact and are not subject to to comparison tolerance.
q)w:10 -8 3 5 -1 2 3
q)w?-8
1
q)w[1]
-8
q)w?3 / the first occurrence of 3
2
q)w?17 / not found
7
q)w[7]
0N
q)"abcde"?"d"
3
?
(find) is a multithreaded primitive.
Type-specific¶
Find is type-specific relative to x
. Where x
is a
-
simple list and
y
a list whose atoms are all the same type asx
, and whose first item is a list, the result corresponds toy
item-by-item; i.e. Find is right-atomic.q)rt:(10 5 -1;-8;3 17) q)i:w?rt q)i 0 3 4 7 2 7 q)w[i] 10 5 -1 0N 3 0N
(If the first item of
y
is an atom, a type error is signalled.) -
list of lists and
y
is a simple list, items ofx
are matched with the whole ofy
.q)u:("abcde";10 2 -6;(2 3;`ab)) q)u?10 2 -6 1 q)u?"abcde" 0
-
list of lists and
y
is a mixed list then items ofx
are matched with items ofy
.q)u?(2 3;`ab) 3 3
In this case Find matches items of
x
with2
3
and`ab
, not(2 3;`ab)
.
The rank of y
should match the rank of the list element for x
.
Rank-sensitive¶
x?y
can’t deal with mixed-rank x
. If rank x
is n then x?y
looks for objects of rank n-1.
2 3?2 3#til 6 / looks for rank 0 objects
(0 1 2;4 5)?2 3#til 6 / looks for rank 1 objects
A solution to find (2 3;`ab)
is
q)f:{where x~\:y}
q)f[u;(2 3;`ab)]
,2
Searching tables¶
Where x
is a table then y
must be a compatible record (dictionary or list) or table. That is, each column of x
, paired with the corresponding item of y
, must be valid arguments of Find.
q)\l sp.q
q)sp?(`s1;`p4;200)
3
q)sp?`s`p`qty!(`s2;`p5;450)
12
Implicit Find¶
Find is implicit in the definitions of except
, in
, within
and dictionary lookup.