sort(cmp=func)

Tobiah toby at tobiah.org
Thu Jul 10 15:03:06 EDT 2008


On Wed, 09 Jul 2008 20:58:32 -0700, Daniel Fetchinson wrote:

>> I have a list of objects that generate code.  Some
>> of them depend on others being listed first, to
>> satisfy dependencies of others.
>>
>> I wrote a cmp function something like this:
>>
>> def dep_cmp(ob1, ob2):
>> 	
>> 	if ob1.name in ob2.deps:
>> 		return -1
>> 	else:
>> 		return 1
>>
>> I also tried returning 0 when there were no dependency
>> relationships between the objects.
>>
>> This failed, because every object was not compared with
>> ever other.  I imagine that this is because sort assumes
>> that if a > b and b > c, then a > c.  In my case, this
>> isn't really true.  If a is not dependent on b, and
>> b is not dependent on c, that doesn't mean that a is not
>> dependent on c.
>>
>> Is there a better way?
> 
> It's only meaningful to talk about sorting if your particular
> definition of "<" is transitive. I.e. a < b and b < c should imply a <
> c. If this is not satisfied, it doesn't make sense to sort according
> to your "<" definition. It's just not a well-defined operation and no
> trick will make it work.

There is a meaningful relationship here however.  Basically, some
items must precede some other items.  There are more than one
correct orders however.  Here was my eventual solution. I had to 
compare each item with each other item, swapping on failed 
dependencies.  Recursion simplified this greatly:

def dep_sort(tables):

        for this_index in range(len(tables)):
                this_table = tables[this_index]
                for prev_index in range(this_index):
                        prev_table = tables[prev_index]
                        if this_table.name in prev_table.deps:
                                tables[prev_index] = this_table
                                tables[this_index] = prev_table
                                dep_sort(tables)
                                return

** Posted from http://www.teranews.com **



More information about the Python-list mailing list