Hpw make lists that are easy to sort.
Paul Rubin
http
Sat Mar 31 01:09:30 EDT 2007
Anton Vredegoor <anton.vredegoor at gmail.com> writes:
> I want the product, but sorted in less time. If Fourier transforms can
> help, I want them :-)
Oh, I see what you mean. I don't see an obvious faster way to do it
and I don't have the feeling that one necessarily exists. As someone
mentioned, you could do an n-way merge, which at least avoids using
quadratic memory. Here's a version using Frederik Lundh's trick of
representing a lazy list as its head plus the generator for the tail:
from heapq import heapify, heappop, heappush
import random
def sortedsums(L,R):
# yield elements of [(i+j) for i in L for j in R] in sorted order
# assumes L and R are themselves sorted
def lundh(x):
g = ((a+x) for a in L)
return (g.next(), g)
heap = [lundh(x) for x in R]
heapify (heap) # not sure this is needed
while heap:
z,zn = heappop(heap)
try: heappush(heap, (zn.next(), zn))
except StopIteration: pass
yield z
def test():
L = sorted(random.sample(xrange(2000),150))
R = sorted(random.sample(xrange(2000),150))
t = sortedsums(L,R)
t2 = sorted([(i+j) for i in L for j in R])
assert list(t) == t2
test()
More information about the Python-list
mailing list