Sorting by item_in_another_list

Paul McGuire ptmcg at austin.rr._bogus_.com
Wed Oct 25 14:38:41 EDT 2006


"Paul McGuire" <ptmcg at austin.rr._bogus_.com> wrote in message 
news:rkN%g.22603$ta3.2702 at tornado.texas.rr.com...
> "J. Clifford Dyer" <jcd at sdf.lonestar.org> wrote in message 
> news:eho2kq$lqc$1 at aioe.server.aioe.org...
>> ZeD wrote:
>>> Paul Rubin wrote:
>>>
>>>>> A = [0,1,2,3,4,5,6,7,8,9,10]
>>>>> B = [2,3,7,8]
>>>>>
>>>>> desired_result = [2,3,7,8,0,1,4,5,6,9,10]
>>>> How about:
>>>>
>>>>   desired_result = B + sorted(x for x in A if x not in B)
>>>
>>> this. is. cool.
>>>
>>
>> Cool, yes, but I'm not entirely sure it does what the OP wanted.  Partly 
>> because I'm not entirely sure what the OP wanted.  Counter example:
>>
>> Given these variables:
>>
>> A = [0,1,2,3,4,5,6,8,9,10]  # Note 7 is missing
>> B = [2,3,7,8]
>>
>> which of the following should the function yield?
>>
>
> From the original post:
>
> "I have two lists, A and B, such that B is a subset of A."
>
> So this is not a case that needs to be supported.
>
> I envisioned something like the OP had a sequence of items to start with, 
> did a random sampling from the list, and wanted to move the sampled items 
> to the front of the list.
>
> -- Paul
>

Here is a little subclass of list that has some set-ish operators added.

-- Paul

# ListWithMath does set-like operations on lists, keeping list order
# stable where applicable
class ListWithMath(list):
    def isSuperset(self,other):
        return len(self ^ other) == len(other)

    def __iadd__(self,other):
        self.extend(other)
        return self

    def __isub__(self,other):
        if self.isSuperset(other):
            for i in other:
                self.remove(i)
            return self
        else:
            raise ValueError

    def __ixor__(self,other):
        for a in self[::-1]:
            if not a in other:
                self.remove(a)
        return self

    def __add__(self,other):
        temp = ListWithMath(self)
        temp += other
        return temp

    def __sub__(self,other):
        temp = ListWithMath(self)
        temp -= other
        return temp

    def __xor__(self,other):
        temp = ListWithMath(self)
        temp ^= other
        return temp

    def __radd__(self,other):
        return ListWithMath(other) + self
    def __rsub__(self,other):
        return ListWithMath(other) - self
    def __rxor__(self,other):
        return ListWithMath(other) ^ self

A = ListWithMath( [0,1,2,3,4,5,6,7,8,9,10] )
B = ListWithMath( [2,3,7,10,8] )

print "%s+(%s-%s)" % (B,A,B)
C = B+(A-B) # union and exclusion
print C

D = ListWithMath( [1,2,3,6,8,11] )
print "%s ^ %s" % (B,D)
print B^D # intersection

print "%s ^= %s" % (B,D)
B ^= D # in-place intersection
print B

print C
C += []
print C
C -= []
print C
C ^= []
print C

Prints:
[2, 3, 7, 10, 8]+([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]-[2, 3, 7, 10, 8])
[2, 3, 7, 10, 8, 0, 1, 4, 5, 6, 9]
[2, 3, 7, 10, 8] ^ [1, 2, 3, 6, 8, 11]
[2, 3, 8]
[2, 3, 7, 10, 8] ^= [1, 2, 3, 6, 8, 11]
[2, 3, 8]
[2, 3, 7, 10, 8, 0, 1, 4, 5, 6, 9]
[2, 3, 7, 10, 8, 0, 1, 4, 5, 6, 9]
[2, 3, 7, 10, 8, 0, 1, 4, 5, 6, 9]
[]





More information about the Python-list mailing list