views:

103

answers:

2

I'm trying to make a dictionary in Python that I can sort through but it seems to change order when I add new things. Is there a way around this?

+9  A: 

A standard Dictionary does not impose an ordering, it's simply a lookup.

You want an Ordered Dictionary or Ordered Dictionary.

Mitch Wheat
Note that Python 3.1 and the eventual Python 2.7 include such a class: http://docs.python.org/dev/whatsnew/2.7.html#pep-372-adding-an-ordered-dictionary-to-collections
Michael Greene
+5  A: 

Python dicts are built as hash tables -- great performance, but ordering is essentially arbitrary and unpredictable. If your need for predictably-ordered walks are occasional, and based on keys or values, the sorted built-in is very handy:

# print all entries in sorted key order
for k in sorted(d): print k, d[k]

# print all entries in reverse-sorted value order
for k in sorted(d, key=d.get, reverse=True): print k, d[k]

# given all keys are strings, print in case-insensitive sorted order
for k in sorted(d, key=str.lower): print k, d[k]

and so forth. If you needs are different (e.g., keep track of the respective times at which keys are inserted, or their values altered, and so forth), the "ordered dictionaries" suggested in other answers will serve you better (but never with the awesome raw performance of a true dict!-).

Alex Martelli