Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

reverse second sort characteristic in python sorted()

I'm trying to sort a list and I can't figure out to reverse the order of a second sorting characteristic.

import math
ps = {1:(1,1),2:(3,2),3:(3,-3),4:(-3,4),5:(-2,-2),6:(3,3),7:(1,-1)} 
l = []
for x in range(1,8):

    l.append((math.atan2(ps[x][1],ps[x][0]),ps[x]))

for c in sorted(l, key = lambda t:(t[0], math.sqrt((0-t[1][0])**2 + (0-t[1][1])**2)),reverse = True):
    print(c)

The first sort characteristic is sorting by angle, the second sorts by distance from the origin if the angle is equal. Does anyone know how to do this. Thanks in advance for the help.

like image 751
code kid Avatar asked Apr 11 '26 01:04

code kid


2 Answers

Put a minus sign in front of the second sort characteristic:

for c in sorted(l, key = lambda t:(t[0], -math.sqrt((0-t[1][0])**2 + (0-t[1][1])**2)),reverse = True):
    print(c)
like image 181
Paul Cornelius Avatar answered Apr 12 '26 16:04

Paul Cornelius


You can do two sorts, least significant first. Python sorting is stable, so the order determined by the first sort will hold when you do the second.

for c in sorted(sorted(l, key = lambda t:math.sqrt((0-t[1][0])**2 + (0-t[1][1])**2)), key = lambda t:t[0], reverse=True):

This method works even when the keys aren't numeric.

like image 28
Mark Ransom Avatar answered Apr 12 '26 14:04

Mark Ransom