On Jan 9, 12:19 pm, Bruno Desthuilliers <bruno. [EMAIL PROTECTED]> wrote: > Andrew Savige a écrit : > > > > > I'm learning Python by reading David Beazley's "Python Essential Reference" > > book and writing a few toy programs. To get a feel for hashes and sorting, > > I set myself this little problem today (not homework, BTW): > > > Given a string containing a space-separated list of names: > > > names = "freddy fred bill jock kevin andrew kevin kevin jock" > > > produce a frequency table of names, sorted descending by frequency. > > then ascending by name. For the above data, the output should be: > > > kevin : 3 > > jock : 2 > > andrew : 1 > > bill : 1 > > fred : 1 > > freddy : 1 > > > Here's my first attempt: > > > names = "freddy fred bill jock kevin andrew kevin kevin jock" > > freq = {} > > for name in names.split(): > > freq[name] = 1 + freq.get(name, 0) > > deco = zip([-x for x in freq.values()], freq.keys()) > > deco.sort() > > for v, k in deco: > > print "%-10s: %d" % (k, -v) > > > I'm interested to learn how more experienced Python folks would solve > > this little problem. > > For a one-shot Q&D script: > > names = "freddy fred bill jock kevin andrew kevin kevin jock" > freqs = [(- names.count(name), name) for name in set(names.split())] > print "\n".join("%-10s : %s" % (n, -f) for f, n in sorted(freqs)) > [snip] That actually prints:
kevin : 3 fred : 2 jock : 2 andrew : 1 bill : 1 freddy : 1 It says that "fred" occurs twice because of "freddy". names = "freddy fred bill jock kevin andrew kevin kevin jock" name_list = names.split() freqs = [(- name_list.count(name), name) for name in set(name_list)] print "\n".join("%-10s : %s" % (n, -f) for f, n in sorted(freqs)) -- http://mail.python.org/mailman/listinfo/python-list