解压lambda函数,我发现了解它在做什么python

时间:2018-10-03 00:53:53

标签: python lambda

我正在实现Grahm Scan convex hull algorithm的前半部分,以从我的点列表中找到一个非复杂的多边形。

我的代码当前为

#!/usr/bin/env python
import random

def sortPoints(points):
    # Computes the cross product of vectors p1p2 and p2p3
    # value of 0 means points are colinear; < 0, cw; > 0, ccw

    # Find the smallest left point and remove it from points
    start = min(points, key=lambda p: (p[0], p[1]))
    points.pop(points.index(start))

    # Sort points so that traversal is from start in a ccw circle.
    points.sort(key=lambda p: (slope(p, start), -p[1], p[0]))

    print points

def slope(p1, p2):
    return 1.0*(p1[1]-p2[1])/(p1[0]-p2[0]) if p1[0] != p2[0] else float('inf')

if __name__ == '__main__':

    templist = [(0,0), (1,5), (6,6), (3,3), (6,1)]
    random.shuffle(templist)
    sortPoints(templist)

代码有效,示例返回[(6,1),(6,6),(3、3),(1,5)]或ccw点列表。

我已经弄清楚了

-p[1], p[0]

lambda函数结尾

points.sort(key=lambda p: (slope(p, start), -p[1], p[0]))

1 个答案:

答案 0 :(得分:0)

Python的sort方法将首先基于slope(p, start)进行排序,然后基于-p[1]进行排序,然后基于p[0]进行排序(用于平局)。 为了更具体地针对您的查询,p[1]是y坐标,-p[1]将根据y坐标的降序进行排序。 同样,p[0]是x坐标,因此排序将以x坐标的升序执行。 希望有帮助。