Which is the best way...

Matthew D. Wood woodm at equire.com
Wed Aug 15 16:54:35 EDT 2001


I have an interesting code-correctness question.  I firmly believe in 
doing things 'The Right Way' and I'm not sure which of these 3 blocks is 
better.  So, if you code-guru's could help me out I would definitely 
appreciate it.



###################################################

#!/usr/bin/env python

list_a = ['a', 'b', 'e', 'c', 'd']
list_b = ['a', 'b', 'c', 'd', 'e']


# Will fail if list *is* in order
def first_non_ordered_dumb (my_list) :
       for index in range(len(my_list)) :
               if my_list[index] > my_list[index + 1] :
                       return index - 1


# Works, but I do that 'if' for every element
# Even though I know that it only matters on the last one.
def first_non_ordered_1 (my_list) :
       last_index = len(my_list) - 1
       for index in range(len(my_list)) :
               if index == last_index :
                       return None

               if my_list[index] > my_list[index + 1] :
                       return index + 1


# Works, but how much overhead is there in the slicing of the range list?
def first_non_ordered_2 (my_list) :
       for index in range(len(my_list))[:-1] :
               if my_list[index] > my_list[index + 1] :
                       return index + 1

       else :
               return None


# Works, but how efficient is the try-except stuff
# when compared to the two above?
def first_non_ordered_3 (my_list) :
       try :
               for index in range(len(my_list)) :
                      if my_list[index] > my_list[index + 1] :
                               return index + 1

       except IndexError :
               return None



for my_list in (list_a, list_b) :
       print my_list
       #print 'dumb:', first_non_ordered_dumb(my_list)
       print '1:', first_non_ordered_1(my_list)
       print '2:', first_non_ordered_2(my_list)
       print '3:', first_non_ordered_3(my_list)


#########################################

I guess I could do it with a while loop, but that always seemed messy.  
A 'C for loop' would work better than a 'python for loop' here, and 
usually that seems to indicate a 'while loop' should be used in python.  
But I MUCH prefer 'for loops' to 'while loops'.  What do you guys think?

Or, as is usually the case, did I miss something that makes the problem 
much easier.





More information about the Python-list mailing list