This question already has an answer here:
How can I find the index of the minimum item in a Python list of floats? If they were integers, I would simply do:
minIndex = myList.index(min(myList))
However, with a list of floats I get the following error, I assume because float equality comparison is rather iffy.
ValueError: 0.13417985135 is not in list
Now, I know that I could simply scroll through the list and compare each item to see whether it is < (min + 0.0000000000001) and > (min - 0.0000000000001), but that is kinda messy. Is there a more elegant (preferably built-in) way to find the index of the smallest item in a list of floats?
I think it's worth putting a few timings up here for some perspective.
All timings done on OS-X 10.5.8 with python2.7
John Clement's answer:
David Wolever's answer:
OP's answer:
Note that I'm purposefully putting the smallest item last in the list to make
.index
as slow as it could possibly be. It would be interesting to see at what N the iterate once answers would become competitive with the iterate twice answer we have here.Of course, speed isn't everything and most of the time, it's not even worth worrying about ... choose the one that is easiest to read unless this is a performance bottleneck in your code (and then profile on your typical real-world data -- preferably on your target machines).
I would use:
Then
val
will be the minimum value andidx
will be its index.Use of the argmin method for numpy arrays.
However, it is not the fastest method: it is 3 times slower than OP's answer on my computer. It may be the most concise one though.
You're effectively scanning the list once to find the min value, then scanning it again to find the index, you can do both in one go: