Python 3: Plist as OrderedDict

Ben Finney ben+python at benfinney.id.au
Tue Feb 9 05:17:23 CET 2010


Gnarlodious <gnarlodious at gmail.com> writes:

> from plistlib import readPlist
> dict=readPlist('/path/file.plist')
> --> arbitrarily ordered dictionary compared to the XML file

Right. The items in a dict are unordered, and when serialised to a list
they will appear in an arbitrary, unpredictable order.

    >>> foo = dict(
    ...     [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)])
    >>> foo
    {'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4}

> from collections import OrderedDict
> OrderedDict(readPlist('/path/file.plist'))
> --> essentially does the same thing as the previous

Yes, because you are initialising an OrderedDict instance from a dict.
That accesses the dict items as an iterable, which of course is going to
retrieve the items in an arbitrary, unpredictable order.

    >>> foo.items()
    dict_items([('a', 1), ('c', 3), ('b', 2), ('e', 5), ('d', 4)])

The OrderedDict then faithfully remembers the arbitrary ordering of the
items.

    >>> from collections import OrderedDict
    >>> OrderedDict(foo.items())
    OrderedDict([('a', 1), ('c', 3), ('b', 2), ('e', 5), ('d', 4)])

> readPlist seems to do the scrambling

Nothing “does” the scrambling; the order is forgotten by the dict as
soon as the items go in.

> I "upgraded" to Py3 to have OrderedDict, so please don't say it is
> impossible...

What you'll need to do is insert the items into the OrderedDict instance
in the desired order. You will, of course, need to define what that
desired order is.

    >>> sorted(foo.items(), key=(lambda item: item[0]))
    [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]
    >>> OrderedDict(sorted(foo.items(), key=(lambda item: item[0])))
    OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)])

-- 
 \          “When we talk to God, we're praying. When God talks to us, |
  `\         we're schizophrenic.” —Jane Wagner, via Lily Tomlin, 1985 |
_o__)                                                                  |
Ben Finney



More information about the Python-list mailing list