[Python-ideas] exclusively1, common, exclusively2 = set1 - set2, set1 & set2, set2 - set1

Peter Otten __peter__ at web.de
Thu Jul 4 09:14:00 CEST 2013


Oscar Benjamin wrote:

> On 3 July 2013 21:50, Paddy3118
> <paddy3118 at gmail.com> wrote:
>> I found myself repeating something that I know I have used before,
>> several times: I get two sets of results, may be sets of the passing
>> tests when a design has changed, and I need to work out what has changed
>> so work out
>>
>> 1. What passed first time round
>> 2. What passed both times.
>> 3. What passed only the second time round.
>>
>> I usually use something like the set equations in the title to do this
>> but I recognise that this requires both sets to be traversed at least
>> three times which seems wasteful.
>>
>> I wondered if their was am algorithm to partition the two sets of data
>> into three as above, but cutting down on the number of set traversals?
> 
> You can do it in one traversal of each set:
> 
> def partition(setx, sety):
>     xonly, xandy, yonly = set(), set(), set()
>     for set1, set2, setn in [(setx, sety, xonly), (sety, setx, yonly)]:
>         for val in set1:
>             if val in set2:
>                 xandy.add(val)
>             else:
>                 setn.add(val)
>     return xonly, xandy, yonly

The price you pay for the symmetry is that for the second iteration of the 
outer loop 

xandy.add(val)

is a noop. When you give up that symmetry you can replace one inner loop 
with a set operation:

def partition(old, new):
    removed = old - new
    common = set()
    added = set()
    for item in new:
        if item in old:
            common.add(item)
        else:
            added.add(item)
    return removed, common, added




More information about the Python-ideas mailing list