Skip to main content

functions - Why is there no PositionFunction in Mathematica?


Too often I have seen the programs of inexperienced users greatly slowed by using Position in an iterative fashion, when far faster would have been to compute a look-up table for positions beforehand.


Mathematica provides such functionality for Nearest and Interpolation "out of the box" with the syntax of function[data] along with dedicated functions NearestFunction and InterpolatingFunction.


There is no equivalent with Position[data] producing a PositionFunction object. I observe that Position appears to be used more often than either of the other functions so this seems like a regrettable omission. Two complications I can think of are:





  • the levelspec of Position




  • the handling of patterns




Based on this I ask:





  1. What other complications are there for creating a PositionFunction?




  2. How best can such a function be implemented?




  3. How can the utility and performance of the function be maximized?





  4. All limitations considered would such a function be valuable?
    Why is there no such functionality in Mathematica?





Answer



I see no mention of the new-in-10 PositionIndex in the other answers, which takes a list (or association) of values and returns a 'reverse lookup' that maps from values in the list to the positions where they occur:


In[1]:= index = PositionIndex[{a, b, c, a, c, a}]

Out[1]= <|a -> {1, 4, 6}, b -> {2}, c -> {3, 5}|>


It doesn't take a level spec yet (though I do want to add that).


In any case, the returned association is already a function in some sense because of the function application way of doing key lookup in associations.


So in the above example you could write index[a] to get a list of places where a occurred.


Comments