[Tutor] min() & mutable sequences
dman
dsh8290@rit.edu
Fri, 21 Dec 2001 13:05:04 -0500
On Thu, Dec 20, 2001 at 01:43:27PM +0800, Andy W wrote:
| Hi people,
|
| First to give some background: I have a list of instances, each has an
| attributes "distance". I want to get the instance with the smallest
| distance.
|
| I have at present:-
|
| robots=[...] #The ... is a whole lot of instances :)
| closest=min([robot.distance for robot in robots])
|
| Okay, I now have the closest *distance*.
| Say more than one instance has the same distance, will min() return the
| first instance with that smallest distance? Because if that is so, I could
| then just get the related instance using:-
No. min() returns the smallest object in the list. In this case the
object is a number, not a robot.
| closest_index=[robot.distance for robot in robots].index(closest)
| #Yeah, I used that list comprehension twice, this is just for demonstration,
| though.
| closest_robot=robots[closest_index]
This could be done, but I think it is inefficient. How about defining
__lt__ in your class? Then you don't need to create separate lists
using the distances.
| Is there a better way to do it?
|
| I guess I could iterate over the list, and keep a smallest distance variable
| somewhere. I guess I've become somewhat of a list-comprehension-addict
| *grin*
This should do it :
m = robots[0]
d = m.distance
for r in robots[1:] :
if r.distance < d : m = r
print m
certainly there are other ways, though.
I'm kinda surprised that min() doesn't take a comparison function like
sort does. Say, I just thought of :
robots.sort( lamda a , b : a.distance < b.distance )
print robots[0]
If you sort it, the minimum will be the first element in the list :-).
-D
--
If your company is not involved in something called "ISO 9000" you
probably have no idea what it is. If your company _is_ involved in ISO
9000 then you definitely have no idea what it is.
(Scott Adams - The Dilbert principle)