Python primer - comments appreciated!

Thorsten Kampe thorsten at
Tue Sep 10 17:54:31 EDT 2002

* Terry Reedy
> "Thorsten Kampe" <thorsten at> wrote in message
> news:aljdhe$1q63hj$1 at
>> def quotient_set(seq, func, partition='nonbool'):
>>     """ partition <seq> into equivalence classes
> To my mind, you should return a dictionary mapping each realized value
> of func (assuming hashable)  to the list of items for which func has
> that value.  In other words, result.values() would be the list of
> equivalence classes.  Let caller toss away info of value defining
> class.  In any case, using a dict to sort items into such classes
> should be much faster that what you wrote.
> def equiv_class(seq, func, part = 'nonbool'):
>  if part == 'bool':
>    result = {False:[], True:[]}
>    for item in seq:
>      result[bool(func(item))].append(item)

Using the 'bool' function and dictionaries makes my whole "if part == 
'bool'" branch superfluous - see below.

>      result.setdefault(func(item),[]).append(item)

To make every item hashable, I made this:

>      # {}.setdefault(key,default) was added for just this sort of usage

Sorry, I just don't get it: your mixing (chaining?) a dict method and 
a list method as if it was a f(g(x)) and /it works/!?! Where is that 
documented? How is is that evaluated (left to right)?

> >>> f = lambda x: x % 3
> >>> equiv_class([0,1,2,3,4,5,6,7,8,9],f,part='bool')

Now this is: 
quotient_set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], lambda x: bool(x % 3))

(Mathematically spoken, the quotient set is the set of all equivalence 
classes induced by func, which is what we return)


More information about the Python-list mailing list