remove matching pairs

Tim Chase python.list at tim.thechases.com
Thu Dec 14 06:34:22 EST 2006


> Is there a simple way to to identify and remove matching pairs from 2
> lists?
> 
> For example:
> 
> I have
> 
> a=[2, 5, 3, 4, 7, 2, 2, 4, 8, 1]
> b=[7, 3, 5, 8, 1, 7, 4, 8, 2, 6]
> 
> and I want to get this:
> 
> a=[2, 5, 3, 4, 7, 2, 8, 1]
> b=[7, 3, 5, 8, 1, 4, 2, 6]

Well, with a few caveats, the following works:

 >>> a=[2, 5, 3, 4, 7, 2, 2, 4, 8, 1]
 >>> b=[7, 3, 5, 8, 1, 7, 4, 8, 2, 6]
 >>> a_prime, b_prime = zip(*set(zip(a,b)))
 >>> a_prime
(2, 8, 4, 7, 1, 5, 2, 3)
 >>> b_prime
(7, 2, 8, 1, 6, 3, 4, 5)

Caveat #1: the order changed because sets are unordered
Caveat #2: a_prime and b_prime are tuples, not lists

If this isn't a true solution (because either #1 or #2 is an 
unacceptable condition), you'd have to go with a loop...something 
like this untested

	pairs = zip(a,b)
	uniq = set(pairs)
	a_prime = []
	b_prime = []
	for pair in pairs:
		if pair in uniq:
			a_prime.append(pair[0])
			b_prime.append(pair[1])
			uniq.remove(pair)
			#if not uniq: break

This should preserve the order as well as maintain listsrather 
than return tuples.  Depending on the number of duplicates you 
expect and the size of your a/b lists, uncommenting out that last 
line may give you a short speedup, as if you've already pulled 
all the items out the uniq set, there's no reason to continue 
iterating over the list of pairs.

HTH,

-tkc








More information about the Python-list mailing list