On 4/3/2016 3:31 PM, Peter Otten wrote:
DFS wrote:

cntText = 60
cntBool = 20
cntNbrs = 30
cntDate = 20
cntBins = 20

strText = "  text:     "
strBool = "  boolean:  "
strNbrs = "  numeric:  "
strDate = "  date-time:"
strBins = "  binary:   "

colCounts = [(cntText,strText) , (cntBool,strBool), (cntNbrs,strNbrs) ,
(cntDate,strDate) , (cntBins,strBins)]

# sort by alpha, then by column type count descending
colCounts.sort(key=lambda x: x[1])
colCounts.sort(key=lambda x: x[0], reverse=True)
for key in colCounts: print key[1], key[0]]

-------------------------------------------------

Output (which is exactly what I want):

    text:      60
    numeric:   30
    binary:    20
    boolean:   20
    date-time: 20

-------------------------------------------------


But, is there a 1-line way to sort and print?

Yes, but I would not recommend it. You can replace the sort() method
invocations with nested calls of sorted() and instead of

for item in items:
     print convert_to_str(item)

use

print "\n".join(convert_to_str(item) for item in items)

Putting it together:

from operator import itemgetter as get
print "\n".join("{1} {0}".format(*p) for p in sorted(
... sorted(colCounts, key=get(1)), key=get(0), reverse=True))

Kind of clunky looking.  Is that why don't you recommend it?




   text:      60
   numeric:   30
   binary:    20
   boolean:   20
   date-time: 20

You could also cheat and use

lambda v: (-v[0], v[1])

and a single sorted().

That works well.  Why is it 'cheating'?


Thanks for the reply.


--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to