sorteddict PEP proposal [started off as orderedict]
Mark Summerfield
m.n.summerfield at googlemail.com
Tue Sep 25 06:24:15 EDT 2007
On 25 Sep, 10:53, "A.T.Hofkamp" <h... at se-162.se.wtb.tue.nl> wrote:
> On 2007-09-25, Mark Summerfield <m.n.summerfi... at googlemail.com> wrote:
>
> > If there is positive feedback I will submit the PEP to the reviewers,
> > so if you think it is a good idea please say so. (I'm sure that if you
> > _don't_ like it you'll tell me anyway:-)
>
> I like the idea, ie +1.
>
> > This PEP proposes the addition of a sorted dictionary class to the
> > standard library's collections module.
>
> You don't seem to mention the sort criterium. I'd suggest to use the __lt__
> operator, which you probably intended since it is commonly used.
You are right that I implicitly use __lt__ (or __cmp__ if there's no
__lt__).
> Also, can I specify a custom sort function, as with list.sort() ?
No. That would make comparing two sorteddicts problematic. You can
always use munged string keys as my second example shows.
> > In addition, the keys() method has two optional arguments:
>
> > keys(firstindex : int = None, secondindex : int = None) -> list of
>
> Not sure this is a good idea. Wouldn't simply
>
> mysorteddict.keys()[firstindex:secondindex]
>
> be much better? It can do all you propose, and more (with iterators/generators
> and such). I see no need to implement it inside the sorteddict as well.
The reason for making it part of th
> > Since the sorteddict's data is always kept in key order, indexes
> > (integer offsets) into the sorteddict make sense. Five additional
> > methods are proposed to take advantage of this:
>
> > key(index : int) -> value
>
> > item(index : int) -> (key, value)
>
> > value(index : int) -> key
>
> > set_value(index : int, value)
>
> > delete(index : int)
>
> I wouldn't do this. It breaks compability with the normal dict. A beginning
> user will expect dict and sorteddict to behave the same (except for
> sortedness), including their set of supporting functions imho.
>
> Otherwise, please make a case for them (and maybe even a new PEP to get them in
> both types of dicts).
>
> > Examples
>
> > To keep a collection of filenames on a case-insensitive file
> > system in
> > sorted order, we could use code like this:
>
> > files = collections.sorteddict.sorteddict()
> > for name in os.listdir("."):
> > files[name.lower()] = name
>
> The more interesting case would be to you preserve case of the files within the
> keys.
>
> I usually need this data structure with an A* algorithm implementation, where I
> need to obtain the cheapest solution found so far.
>
> > for item in listOfItems:
> > itemsByDate["%s\t%17X" % (item.date, id(item))] = item
> > itemsByName["%s\t%17X" % (item.name, id(item))] = item
> > itemsBySize["%s\t%17X" % (item.size, id(item))] = item
>
> Wouldn't a line like "itemsBySize[(item.size, id(item))] = item" do as well?
>
> (or with a custom sort function on items?)
>
> > Now we can iterate in date or name order, for example:
>
> > for item in itemsByDate:
> > print item.name, item.date
>
> Hmm, not with dict:
>
> >>> for x in {1:10, 2:20}:
>
> ... print x
> ...
> 1
> 2
>
> So you should get your "%s\t%17X" strings here.
>
> Sincerely,
> Albert
More information about the Python-list
mailing list