[Tutor] how to keep track of sorted lists
Dave Angel
d at davea.name
Sat Nov 3 15:17:50 CET 2012
On 11/03/2012 09:04 AM, Albert-Jan Roskam wrote:
> Hello,
(I haven't run the code, as it was not presented in a form that I could
do a single copy/paste. So I may have missed some subtlety in the code.)
> I want to make a get() method that uses a binary search. This requires the data to be sorted which is an expensive operation, so I would like to do this no more often than needed.
> Which of the to classes below is the best way to keep track of the sorted lists? TestOne stores them in separate attributes, while TestTwo uses one sorted_ attribute that is a dictionary that contains all the sorted data, with keys as, well, keys. I am inclined to think that TestTwo is less messy. Btw, I am aware that, either way, it may not be a good idea to store all these potentially huge sorted lists.
>
> Python 2.7.0+ (r27:82500, Sep 15 2010, 18:04:55)
> [GCC 4.4.5] on linux2
Thanks for telling us the version and OS.
>>>> import bisect
>>>> class TestOne(object):
> def __init__(self, param="x"):
> self.param = param
> self.data = range(10, 1, -1)
> def get(self, key):
> sorted_ = "sorted_" + self.param
> if not hasattr(self, sorted_):
> setattr(self, sorted_, sorted(self.data))
> return bisect.bisect_right(getattr(self, sorted_), x=key)
Why have multiple copies of the sorted data, when there's only one list?
>>>> t = TestOne("x")
>>>> t.get(1)
> 0
>>>> class TestTwo(object):
> def __init__(self, param="x"):
> self.param = param
> self.data = range(10, 1, -1)
> def get(self, key):
> k = "sorted_" + self.param
> if not hasattr(self, "sorted_"):
This will only work for the first param. After that, the attribute will
exist and the the setattr will be skipped.
> setattr(self, "sorted_", {k: sorted(self.data)})
> return bisect.bisect_right(getattr(self, "sorted_")[k], x=key)
>>>> t = TestTwo("x")
>>>> t.get(1)
> 0
>
>
Good job simplifying the problem. But it's so simple i can't see what
the real goal is without some textual description. Is a single instance
of this class intended to hold a single, unchanging list? If not, are
you intending to delete the sorted_ attribute each time it changes?
The param value would make sense to me if it affected the sort. But
otherwise, what's the point of having multiple sorted copies of a list,
when they'll all be identical? And if param is constant for any given
instance of the class, then what's the point of all this indirection on it?
--
DaveA
More information about the Tutor
mailing list