Python primer - comments appreciated!

Thorsten Kampe thorsten at thorstenkampe.de
Mon Sep 9 20:14:35 EDT 2002


"Python, anyone?"... Yep, this is my first one. Comments on
style/readability and technique/flow appreciated!

#v+
def quotient_set(seq, func, partition='nonbool'):
    """ partition <seq> into equivalence classes

    With the 'bool' parameter 'quotient_set' always returns two lists: the
    first  containing the 'true' items and the second containing the false
    ones. """
    if partition == 'bool':
    # Yes, I know about 'filter', but this returns just the 'true
    # elements'...
    
        # put this in one line?
        true_class  = []
        false_class = []

        for item in seq:
            if func(item):
                true_class.append(item)
            else:
                false_class.append(item)
        return [true_class, false_class]
        
    else:
        # put this in one line?
        quotient_set =         []
        representative_class = []

        for item in seq:
            representative = func(item)

            # "Try: seq.index(item)" is IMO rather ugly in a loop. But
            # it's even better than "if item in seq: seq.index(item)",
            # which goes twice through seq
            try:
                quotient_set_index = representative_class.index(representative)
            except ValueError:
                quotient_set.append([item])
                representative_class.append(representative)            
            else:
                # This somehow "inelegant", because all I want to do is:
                # "seq[index] = seq[index].append(item)" Suggestions?
                equivalence_class = quotient_set[quotient_set_index]
                equivalence_class.append(item)
                quotient_set[quotient_set_index] = equivalence_class
                
        return quotient_set
#v-

To get a feeling for what 'quotient_set' does, try:
>>> f = lambda x: x % 3
>>> quotient_set([1, 2, 3, 4, 5, 6, 7, 8, 9], f)
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

>>> quotient_set([1, 2, 3, 4, 5, 6, 7, 8, 9], f, 'bool')
[[1, 2, 4, 5, 7, 8], [3, 6, 9]]

#v+
def set(seq):
    """ make <seq> a true set by removing duplicates """
    # Shortest way to do a 'null function'? 'None' doesn't work...
    f = lambda x: x  # identity function
    
    return [item[0] for item in quotient_set(seq, f)]    
#v-



More information about the Python-list mailing list