[EMAIL PROTECTED] wrote:

> I can sort by the real parts just fine:
>
>     >>> lst.sort(key=lambda x: x.real)
>     >>> pprint.pprint(lst)
>     [2.6000000000000001j,
>      20j,
>      (1+2.73j),
>      (1+21j),
>      (2+2.8600000000000003j),
>      (2+22j),
>      (3+2.9900000000000002j),
>      (3+23j),
>      (4+3.1200000000000001j),
>      (4+24j),
>      (5+3.25j),
>      (5+25j),
>      (6+26j),
>      (6+3.3799999999999999j),
>      (7+27j),
>      (7+3.5100000000000002j),
>      (8+28j),
>      (8+3.6400000000000001j),
>      (9+3.77j),
>      (9+29j)]
>
> but how do I then do a secondary sort by the imaginary part, preserving the
> existing ordering on the real parts?  Seems like I have to resort to a
> Schwartzian transform and map the complex numbers to tuples, sort that, then
> map them back.  With the cmp key it would have been a fairly trivial task to
> define the desired compare-real-then-imag function.
>
> Is there a way to do this using just the key arg, no extra data structures?

Is a tuple an extra data structure?

>>> lst.sort(key=lambda x: (x.real,x.imag))
>>> pprint.pprint(lst)
[2.6000000000000001j,
 20j,
 (1+2.73j),
 (1+21j),
 (2+2.8600000000000003j),
 (2+22j),
 (3+2.9900000000000002j),
 (3+23j),
 (4+3.1200000000000001j),
 (4+24j),
 (5+3.25j),
 (5+25j),
 (6+3.3799999999999999j),
 (6+26j),
 (7+3.5100000000000002j),
 (7+27j),
 (8+3.6400000000000001j),
 (8+28j),
 (9+3.77j),
 (9+29j)]

If you don't like the tuple then just do the two sorts separately:

>>> lst.sort(key=lambda x: x.imag)
>>> lst.sort(key=lambda x: x.real)
>>> pprint.pprint(lst)
[2.6000000000000001j,
 20j,
 (1+2.73j),
 (1+21j),
 (2+2.8600000000000003j),
 (2+22j),
 (3+2.9900000000000002j),
 (3+23j),
 (4+3.1200000000000001j),
 (4+24j),
 (5+3.25j),
 (5+25j),
 (6+3.3799999999999999j),
 (6+26j),
 (7+3.5100000000000002j),
 (7+27j),
 (8+3.6400000000000001j),
 (8+28j),
 (9+3.77j),
 (9+29j)]
>>> 

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to