help printing dictionary, sorted by values.

Thomas Wouters thomas at xs4all.nl
Tue Aug 17 08:58:25 CEST 1999


On Mon, Aug 16, 1999 at 11:16:47PM -0600, Jerry Williams 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.

Have you tried the Python Tutorial ?
http://www.python.org/doc/current/tut/

As for examples, here's probably what you want:

[thomas at tilburg ~]$ python
Python 1.5.1 (#1, Sep  3 1998, 22:51:17)  [GCC 2.7.2.3] on linux-i386
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam

>>> dict = {} 		# an empty dictionary

>>> dict['spam'] = 'eggs' # Insert a string, with a string as key
>>> dict[5.4] = [2, 3, 4] # Insert a list, with a floating point number as key
>>> dict[1,2,3] = {} 	# insert an (empty) dictionary, with a tuple as key
>>> dict['me'] = dict 	# insert a reference to the dict itself

>>> dict		# 'print' the dict
{'spam': 'eggs', (1, 2, 3): {}, 'me': {...}, 5.4: [2, 3, 4]}
>>> dict.keys()		# print the dict's keys
['spam', (1, 2, 3), 'me', 5.4]
>>> dict.values()	# print the dict's values.
['eggs', {}, {'spam': 'eggs', (1, 2, 3): {}, 'me': {...}, 5.4: [2, 3, 4]}, [2, 3, 4]]

>>> dict['spam']	# Index by string
'eggs'
>>> myindx = 5.4	
>>> dict[myindx]	# Index by variable
[2, 3, 4]
>>> dict["me"]["me"][1,2,3]	# Index-index-index
{}

>>> for key in dict.keys():	# Print all dict values by hand
...     print dict[key]
... 
eggs
{}
{'spam': 'eggs', (1, 2, 3): {}, 'me': {...}, 5.4: [2, 3, 4]}
[2, 3, 4]

What you want to do is probably something like this:

import sys

if len(sys.argv) < 2:
	print "Usage: %s <file>"%sys.argv[0]
	sys.exit()

result = {}

file = open(sys.argv[1], 'r')
for line in file.readlines():
	line = line[:-1] # We want to lose the newline
	if result.has_key(line): # This could be done with exceptions too.
		result[line] = result[line] + 1
	else:
		result[line] = 1

resultlines = result.keys()
resultlines.sort(lambda x, y: cmp(result[y], result[x]))
for line in resultlines:
	print "%d %s"%(result[line], line)

Note cmp(result[y], result[x]), not cmp(result[x], result[y]), to sort the
list highest value first. You can also do a 'resultlines.reverse()' after
the sort to get the same effect.

This is what it does:

% python mysort.py testfile
66 d
60 f
36 l
36 ;
24 u
24 k
24 n
24 j
12 e
12 i
12 h
12 2
12 0
12 r
12 w
12 v
6 ,
4 s
3 p
2 a
1 m

Nevertheless, reading the tutorial and parts of the Library Reference really
are really good ideas.

and-i-didnt-even-show-the-other-10-good-ways-to-do-it'ly y'rs.

-- 
Thomas Wouters <thomas at xs4all.net>

Hi! I'm a .signature virus! copy me into your .signature file to help me spread!




More information about the Python-list mailing list