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$ – Too Fat Man No Neck Jun 27 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[...].

| improve this answer | |
$\endgroup$
  • 3
    $\begingroup$ you need to add = after >. $\endgroup$ – Too Fat Man No Neck Jun 27 at 17:10
  • $\begingroup$ @TooFatManNoNeck You're right! Fixed, thank you, and thanks for the accept as well. $\endgroup$ – MarcoB Jun 27 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.

| improve this answer | |
$\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]
| improve this answer | |
$\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}

| improve this answer | |
$\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.