python bisect questions

John Machin sjmachin at lexicon.net
Thu Apr 3 18:43:32 EDT 2008


On Apr 4, 9:21 am, ankitks.mi... at gmail.com wrote:
> On Apr 3, 4:24 pm, "Terry Reedy" <tjre... at udel.edu> wrote:
>
>
>
>
>
>
>
> > <ankitks.mi... at gmail.com> wrote in message
>
> >news:6bb6927b-f553-40db-a142-2ce86b9e819f at q27g2000prf.googlegroups.com...
> > |I am week on functional programming, and having hard time
> > | understanding this:
> > |
> > | class myPriorityQueue:
> > |      def __init__(self, f=lamda x:x):
> > |              self.A = []
> > |              self.f = f
> > |
> > |      def append(self, item)
> > |              bisect.insort(self.A, (self.f(item), item))
> > |    ............
> > |
> > | now I know we are inserting items(user defined type objects) in list A
> > | base on sorting order provided by function A.
> > | but what I don't understand is bisect command
> > | what does bisect.insort(self.A, (self.f(item), item)) doing
>
> here is doc
> insort_right(a, x[, lo[, hi]])
>
>     Insert item x in list a, and keep it sorted assuming a is sorted.
>
>     If x is already in a, insert it to the right of the rightmost x.
>
>     Optional args lo (default 0) and hi (default len(a)) bound the
>     slice of a to be searched.
>
> but I am still confuse. self.A is my list a. and item is x that
> I am trying to insert.
> So it needs to be of type item not (self.f(item), item)
> It doesn't say anything pass sorting function self.f(item).

That's correct. You are passing a tuple of (sort_key, actual_data).

Example use case: caseless sortorder but you want to retrieve the
original data. f is lambda x: x.upper() or similar. Your data is
'foo', 'Bar', 'zOt'. Calls to your_queue.append will result in the
following 2nd args for bisect.insort:
('FOO', 'foo')
('BAR', 'Bar')
('ZOT', 'zOt')

Consider executing the code with a couple of print statements in it so
that you can see what is happening.



More information about the Python-list mailing list