Dirk Nachbar wrote: > Here is a function which takes any list and creates a freq table, > which can be printed unsorted, sorted by cases or items. It's supposed > to mirror the proc freq in SAS. > > Dirk > > def freq(seq,order='unsorted',prin=True): > #order can be unsorted, cases, items > > freq={} > for s in seq: > if s in freq: > freq[s]+=1 > else: > freq[s]=1 > if prin==True: > print 'Items=',len(seq),'Cases=',len(freq) > print '------------------------' > if order=='unsorted': > for k in freq.keys(): > print k,freq[k],float(freq[k])/len(seq) > elif order=='cases': > #http://blog.client9.com/2007/11/sorting-python-dict-by- > value.html > freq2=sorted(freq.iteritems(), key=lambda (k,v): > (v,k),reverse=True)
Sorting in two steps gives a slightly better result when there are items with equal keys. Compare >>> freq = {"a": 2, "b": 1, "c": 1, "d": 2} >>> sorted(freq.iteritems(), key=lambda (k, v): (v, k), reverse=True) [('d', 2), ('a', 2), ('c', 1), ('b', 1)] with >>> freq2 = sorted(freq.iteritems(), key=lambda (k, v): k) >>> freq2.sort(key=lambda (k, v): v, reverse=True) >>> freq2 [('a', 2), ('d', 2), ('b', 1), ('c', 1)] Here the keys within groups of equal frequency are in normal instead of reversed order. -- http://mail.python.org/mailman/listinfo/python-list