In what order does Python read dictionary keys?

Michael P. Reilly arcege at shore.net
Tue Jun 8 22:30:57 EDT 1999


Timothy R Evans <tre17 at cosc.canterbury.ac.nz> wrote:

: To get the keys sorted alter your loop to be:

: for key in entries.keys().sort():

The right idea, but the wrong implimentation.  Unfortunately, sort()
does not return the sorted list, it sorts in-place.

  keys = entries.keys()
  keys.sort()
  for key in keys:

: From the look of this example, you probably would be better off using
: a nested tuple like this:

: """
: entries = (('red', 'Type the red value, please: '),
:            ('green', 'Type the green value, please: '),
:            ('blue', 'Type the blue value, please: '))

: for key,value in entries:
: ...
: """

: or even:

: """
: entries = ('red', 'green', 'blue')

: for key in entries:
:     value = 'Type the ' + key + ' value, please: '
: """

: This way you can control the order exactly and it might be faster as
: you avoid the cost of a dictionary lookup.

If this was only for these three values, tuples would be the most
efficient.  

But in general (outside of the question now) tuples can't be searched
easily, I would suggest either the dictionary or a list (with the
'index' method).

You can also make a subclass of UserDict with the proper ordering:

class Colors(UserDict):
  ordered_keys = ('red', 'green', blue')
  def keys(self):
    l = []
    for key in self.ordered_keys:
      if self.has_key(key):
        l.append(key)
    return l
  def items(self):
    l = []
    for key in self.keys():
      l.append( (key, self[key]) )
    return l
  def values(self):
    l = []
    for key in self.keys():
      l.append( self[key] )
    return l

This makes it all work like you desire, at the expense of a little more
processing.

  -Arcege





More information about the Python-list mailing list