|
|
|
@ -1193,34 +1193,10 @@ that final assignment still results in an error, because tuples are immutable. |
|
|
|
Dictionaries |
|
|
|
============ |
|
|
|
|
|
|
|
How can I get a dictionary to display its keys in a consistent order? |
|
|
|
--------------------------------------------------------------------- |
|
|
|
|
|
|
|
You can't. Dictionaries store their keys in an unpredictable order, so the |
|
|
|
display order of a dictionary's elements will be similarly unpredictable. |
|
|
|
|
|
|
|
This can be frustrating if you want to save a printable version to a file, make |
|
|
|
some changes and then compare it with some other printed dictionary. In this |
|
|
|
case, use the ``pprint`` module to pretty-print the dictionary; the items will |
|
|
|
be presented in order sorted by the key. |
|
|
|
|
|
|
|
A more complicated solution is to subclass ``dict`` to create a |
|
|
|
``SortedDict`` class that prints itself in a predictable order. Here's one |
|
|
|
simpleminded implementation of such a class:: |
|
|
|
|
|
|
|
class SortedDict(dict): |
|
|
|
def __repr__(self): |
|
|
|
keys = sorted(self.keys()) |
|
|
|
result = ("{!r}: {!r}".format(k, self[k]) for k in keys) |
|
|
|
return "{{{}}}".format(", ".join(result)) |
|
|
|
|
|
|
|
__str__ = __repr__ |
|
|
|
|
|
|
|
This will work for many common situations you might encounter, though it's far |
|
|
|
from a perfect solution. The largest flaw is that if some values in the |
|
|
|
dictionary are also dictionaries, their values won't be presented in any |
|
|
|
particular order. |
|
|
|
How can I get a dictionary to store and display its keys in a consistent order? |
|
|
|
------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
Use :class:`collections.OrderedDict`. |
|
|
|
|
|
|
|
I want to do a complicated sort: can you do a Schwartzian Transform in Python? |
|
|
|
------------------------------------------------------------------------------ |
|
|
|
|