? 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
ythe smallest index ofy - list
ythe 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
ya list whose atoms are all the same type asx, and whose first item is a list, the result corresponds toyitem-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
yis an atom, a type error is signalled.) -
list of lists and
yis a simple list, items ofxare 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
yis a mixed list then items ofxare matched with items ofy.q)u?(2 3;`ab) 3 3In this case Find matches items of
xwith23and`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.