I could use a hand.
Victor.
--
Victor Eijkhout -- eijkhout at tacc utexas edu
Just do the pairing, but in a 'list', not a dictionary (a dictionary is
unordered and can't be sorted). You need to keep track of which keys belong to
which values anyway. And anything in Python is a reference: you're not copying
the data by creating the pairs. That is, the space overhead is proportional to
the number of items but is independent of the data size of each item.
Cheers & hth.,
- Alf
If I believe this is not a premature optimization (a question about
which I am currently skeptical) I'd suggest conversion to a list of
pairs rather than a dict.
Can you use zip() on numpy arrays? That would be the easiest way to
create the list of pairs.
regards
Steve
--
Steve Holden +1 571 484 6266 +1 800 494 3119
See PyCon Talks from Atlanta 2010 http://pycon.blip.tv/
Holden Web LLC http://www.holdenweb.com/
UPCOMING EVENTS: http://holdenweb.eventbrite.com/
second[first.argsort()]
Ask numpy questions on the numpy mailing list.
http://www.scipy.org/Mailing_Lists
--
Robert Kern
"I have come to believe that the whole world is an enigma, a harmless enigma
that is made terrible by our own mad attempt to interpret it as though it had
an underlying truth."
-- Umberto Eco
> second[first.argsort()]
Really cool. Thanks.
> Ask numpy questions on the numpy mailing list.
I will. I thought that this question would have an answer in a generic
python idiom.
When dealing with numpy arrays, the generic Python idiom is often much slower.
Not an unreasonable assumption, but it turns out that for most Python
users (estimate PFTA: 97%) numpy/scipt is esoteric knowledge.
Alf's recommendation is clean and correct. Just make a list of
tuples.
FWIW, here's a little hack that does the work for you:
>>> values = ['A', 'B', 'C', 'D', 'E']
>>> keys = [50, 20, 40, 10, 30]
>>> keyiter = iter(keys)
>>> sorted(values, key=lambda k: next(keyiter))
['D', 'B', 'E', 'C', 'A']
Raymond
Another option:
[values[i] for i in sorted(range(len(keys)), key=lambda i: keys[i])]
Sort the indexes according to keys values, then use indexes to get the
values.
It might read more clearly when broken out into two lines:
>>> sorted_indexes = sorted(range(len(keys)), key = lambda i: keys[i])
>>> sorted_indexes
[3, 1, 4, 2, 0]
>>> [values[i] for i in sorted_indexes]
['D', 'B', 'E', 'C', 'A']
The advantage of Raymond's solution is that he only creates one new
Python list, whereas my solutions create an intermediate Python list
of integers. I don't think my solution really is that space-wasteful,
though, since by the time the second list gets created, any internal
intermediate lists from CPython's sorted() implementation will
probably have been cleaned up.