4

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?

C. E.
  • 70,533
  • 6
  • 140
  • 264
Display Name
  • 2,009
  • 8
  • 17

4 Answers4

8
FirstPosition[{1, 4, 10, 12, 20}, _?(# >= 11 &)]

(* Out: {4} *)

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

MarcoB
  • 67,153
  • 18
  • 91
  • 189
4

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.

C. E.
  • 70,533
  • 6
  • 140
  • 264
3

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]

flinty
  • 25,147
  • 2
  • 20
  • 86
3

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}

user1066
  • 17,923
  • 3
  • 31
  • 49