4
$\begingroup$

Assume I have an ordered, ascending list {1,4,10,12,20}. I want to find the smallest position of an element of the list such that the element is not less than 11? The position in question is 4.

How to do this easily?

$\endgroup$
  • $\begingroup$ @user1066: A nice idea. But your list is not the same as mine. 11 is not in the list. $\endgroup$ – Artificial Stupidity Jun 27 '20 at 17:31
8
$\begingroup$
FirstPosition[{1, 4, 10, 12, 20}, _?(# >= 11 &)]

(* Out: {4} *)

If you want just the number $4$, then use First@FirstPosition[...].

$\endgroup$
  • 3
    $\begingroup$ you need to add = after >. $\endgroup$ – Artificial Stupidity Jun 27 '20 at 17:10
  • $\begingroup$ @TooFatManNoNeck You're right! Fixed, thank you, and thanks for the accept as well. $\endgroup$ – MarcoB Jun 27 '20 at 18:25
4
$\begingroup$

This question is closely related to the question Best way to insert element into an ordered list at the correct position? , where it was noted that Leonid Shifrin's bsearchMax from this answer is a fast way to solve the problem. Like flinty's answer it uses a binary search but it appears to be faster.

bsearchMax[{1, 4, 10, 12, 20}, 11]

4

For a list of decent size, bsearchMax can be orders of magnitude faster than FirstPosition.

$\endgroup$
3
$\begingroup$

A couple of slower alternatives to FirstPosition:

data = {1, 4, 10, 12, 20};

Position[data, SelectFirst[data, # >= 11 &]][[1, 1]]

Needs["Combinatorica`"]; Ceiling@BinarySearch[data, 11]
$\endgroup$
3
$\begingroup$

As the list is in ascending order, maybe:

1+LengthWhile[{1, 4, 10,12,20}, # <11 &]

4

A slight variation on the FirstPosition answer of MarcoB (originally posted as a comment):

FirstPosition[UnitStep[{1,4,10,12,20}-11],1]

{4}

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.