boolean operations on sets

Diez B. Roggisch deets at nospam.web.de
Mon Aug 6 11:44:46 EDT 2007


Flavio wrote:

> Hi, I have been playing with set operations lately and came across a
> kind of surprising result given that it is not mentioned in the
> standard Python tutorial:
> 
> with python sets,   intersections  and unions are supposed to be done
> like this:
> In [7]:set('casa') & set('porca')
> Out[7]:set(['a', 'c'])
> 
> In [8]:set('casa') | set('porca')
> Out[8]:set(['a', 'c', 'o', 'p', 's', 'r'])
> 
> and they work correctly. Now what is confusing is that if you do:
> 
> In [5]:set('casa') and set('porca')
> Out[5]:set(['a', 'p', 'c', 'r', 'o'])
> 
> In [6]:set('casa') or set('porca')
> Out[6]:set(['a', 'c', 's'])
> 
> The results are not what you would expect from an AND  or OR
> operation, from the mathematical point of view! aparently the "and"
> operation is returning the the second set, and the "or" operation is
> returning the first.
> 
> If python developers wanted these operations to reflect the
> traditional (Python) truth value for data structures: False for empty
> data structures and True otherwise, why not return simply True or
> False?
> 
> So My question is: Why has this been implemented in this way? I can
> see this confusing many newbies...

It has nothing to do with sets - it stems from the fact that certain values
in python are considered false, and all others true. And these semantics
were introduced at a point where there was no explicit True/False, so the
operators were defined in exact the way you observed.

Consider this:

"foo" or "bar" -> "foo"

So - nothing to do with sets.

Diez





More information about the Python-list mailing list