Ordered dictionaries?
Martin Franklin
martin.franklin at westgeo.com
Thu Dec 13 17:40:53 EST 2001
David Brady wrote:
> Hello,
>
> One last Perl module that I need to replace to
> complete my Python toolkit is a custom module that let
> me create a dictionary whose keys were settable and
> retrievable in a particular order. Essentially, this
> let us have a list whose ordered elements were also
> accessible by name.
>
> Has anyone done this? If not, what class operators
> would I need to override to create my own class that
> does this?
>
> Example of how it would work, assuming OrderedDict was
> a working class of what I wanted:
>
>>>> od = OrderedDict()
>>>> od['Alice'] = 'Anderson'
>>>> od['Bob'] = 'Bradley'
>>>> od.append('Christiansen')
>>>> od.['Dave'] = 'Dobson'
>>>> od.keys()
> ['Alice', 'Bob', 2, 'Dave']
>>>> od.values()
> ['Anderson', 'Bradley', 'Christiansen', 'Dobson']
>>>> od[3]
> 'Dobson'
>>>> od[7] = 'Johnson'
> # Notice assignment does not trigger IndexError
>>>> od.values()
> ['Anderson', 'Bradley', 'Christiansen', 'Dobson']
>>>> len(od)
> 8
>>>> for i in range(len(od)): print od[i]
> Anderson
> Bradley
> Christiansen
> Dobson
> None
> None
> None
> Johnson
>
> ...etc. Notice that this is making the python list
> act more like a Perl list, which may not be desirable.
> Also, I don't know if the None object "exists" in
> terms of taking up space in the list, my thinking is
> that it shouldn't; that trying to access an undefined
> element should create the None object and return it
> rather than padding the list with statically-created
> None objects.
>
> Anyway, if anyone has already done this, I'd love to
> see it; if not, some tips about where to start would
> be wonderful. Is there a canonical list of all the
> __functions__ a Python object can have, when they are
> called and why, and what they must do if implemented
> by a user?
>
> Thank you,
>
> -dB
>
> =====
> David Brady
> daves_spam_dodging_account at yahoo.com
> I'm feeling very surreal today... or *AM* I?
>
> __________________________________________________
> Do You Yahoo!?
> Check out Yahoo! Shopping and Yahoo! Auctions for all of
> your unique holiday gifts! Buy at http://shopping.yahoo.com
> or bid at http://auctions.yahoo.com
>
>
One way to go would be:
from UserDict import UserDict
class OrderedDict(UserDict):
def __init__(self):
UserDict.__init__(self)
def keys(self):
keys=self.data.keys()
keys.sort()
return keys
def values(self):
values=self.data.values()
values.sort()
return values
def __setitem__(self, key, value):
if type(key)==type(1):
# key is index
try:
key=self.keys()[key]
except IndexError:
return None
self.data[key]=value
else:
self.data[key]=value
def __getitem__(self, key):
if type(key)==type(1):
# key is index so return value of nth sorted key
try:
return self[self.keys()[key]]
except IndexError:
return None
else:
return self.data[key]
if __name__=='__main__':
od = OrderedDict()
od['Alice'] = 'Anderson'
od['Bob'] = 'Bradley'
od['Jim'] = 'Smith'
od['Sarah'] = 'Zac'
od['Dave'] = 'Dobson'
od[3] = 'Johnson'
Martin
More information about the Python-list
mailing list