help printing dictionary, sorted by values.
Michael P. Reilly
arcege at shore.net
Tue Aug 17 12:00:43 EDT 1999
Jerry Williams <jwilliam at xmission.com> wrote:
: I have searched and searched the docs and am really frustrated with
: them.
: All I can seem to find is bits and pieces that hint about dictionaries.
: I finally found a table under mappings that listed the methods. But
: I couldn't find anything that would list each data type and what methods
: are available. What I am trying to do is take a file with a bunch of
: entries that appear more than once and list the count of each occurance
: in order of the highest count. So if the file looked like:
: a
: a
: a
: b
: b
: c
: Then is would print:
: 3 a
: 2 b
: 1 c
: I thought a dictionary would work great, but can't seem to figure out
: how to sort it by values and also get the key.
: list = dict.values()
: list.sort()
: Then I get lost. And the counts aren't going to be unique.
: Thanks for any help. Please point me to where the methods are listed
: for
: the dictionary. And some examples of dictionaries would be helpful.
How about:
def repr_sorted_dict(d):
"""Return a string representation of a dictionary,
sorted by value first."""
def cmpitems_by_value(a, b):
"""sort first by second element in sequence."""
v = cmp(a[1], b[1])
# if equal, then sort by first element in sequence
if v == 0:
v = cmp(a[0], b[0])
return v
import string
# retrieve the (key, value) pairs
items = d.items()
items.sort(cmpitems_by_value)
# display the pairs
l = []
for k, v in items:
l.append("%s: %s" % (`k`, `v`))
# now combine them as a dictionary display
return '{' + string.joinfields(l, ', ') + '}'
Then you can:
print repr_sorted_dict(my_values)
And if you really wanted to get fancy, you could make this function the
__repr__ method of a subclass of UserDict.UserDict.
from UserDict import UserDict
class ReverseSortedDict(UserDict):
__repr__ = lambda self: repr_sorted_dict(self.data)
(Although I'd rewrite it to use the UserDict interface rather than
self.data itself, but that's just me. :)
Even if this is not exactly what you want, the "pairs = dict.items();
pairs.sort(...)" should get you where you are going. :)
This is documented at:
http://www.python.org/doc/current/lib/typesmapping.html
http://www.python.org/doc/current/lib/typesseq-mutable.html
-Arcege
More information about the Python-list
mailing list