sorting list of complex numbers
Gabriel Genellina
gagsl-py2 at yahoo.com.ar
Tue Nov 18 15:18:43 EST 2008
En Tue, 18 Nov 2008 08:41:58 -0200, Paul Rubin
<"http://phr.cx"@nospam.invalid> escribió:
> skip at pobox.com writes:
>> but how do I then do a secondary sort by the imaginary part,...
>> Is there a way to do this using just the key arg, no extra data
>> structures?
>
> Clever solutions involving multiple sorts aside, I think what they
> really want you to do is something like (untested):
>
> class mkKey(complex):
> def __lt__(self, other):
> a = cmp(self.real, other.real)
> return a if a else cmp(self.imag, other.imag)
>
> then:
>
> yourlist.sort(key=mkKey)
>
> for fancier structures you'd need a full blown class implementation
> with an init method. Either way you end up temporarily allocating a
> lot of extra structures, but at least they're not all in memory
> simultaneously like in the DSU pattern.
Yes, the keys for all items in the list are all created when the sort
begins, and live until the sort finishes. list.sort(key=...) is actually
implemented using the DSU pattern, something like this:
for i in range(len(alist)):
alist[i] = (key(alist[i]), alist[i])
# ...sort items...
for i in range(len(alist)):
alist[i] = alist[i][1]
except a custom `sortwrapper` object is used instead of a 2-item tuple.
--
Gabriel Genellina
More information about the Python-list
mailing list