recommend OrderedDict for this FAQ (closes #19805)
This commit is contained in:
parent
0ee22bf774
commit
b152e177ef
|
@ -1193,34 +1193,10 @@ that final assignment still results in an error, because tuples are immutable.
|
||||||
Dictionaries
|
Dictionaries
|
||||||
============
|
============
|
||||||
|
|
||||||
How can I get a dictionary to display its keys in a consistent order?
|
How can I get a dictionary to store and 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.
|
|
||||||
|
|
||||||
|
Use :class:`collections.OrderedDict`.
|
||||||
|
|
||||||
I want to do a complicated sort: can you do a Schwartzian Transform in Python?
|
I want to do a complicated sort: can you do a Schwartzian Transform in Python?
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
Loading…
Reference in New Issue