Sorting a list

DFS nospam at dfs.com
Sun Apr 3 16:08:42 EDT 2016


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.





More information about the Python-list mailing list