如何在坐标列表中找到一个角?

How to find a corner in a list of coordinates?

我对以下代码有一个 style/performance 问题:

dq=((410, -890), (490, -890), (490, -790), (590, -790), (590, -710), 
    (490, -710), (490, -590), (590, -590), (590, -510), (490, -510), 
    (490, -410), (410, -410), (410, -510), (310, -510), (310, -590), 
    (410, -590), (410, -710), (310, -710), (310, -790), (410, -790))
maxy=max([q[1] for q in dq])
minx=min([q[0] for q in dq if q[1]==maxy])
idx=dq.index((minx,maxy))

我有一个坐标列表,我想找到具有最大 Y 值和最小 X 值的索引。

有什么better/pythonic方法可以做到这一点吗?

如果您更喜欢函数式代码风格:

get_x = operator.itemgetter(0)
get_y = operator.itemgetter(1)
maxy = max(dq, key=get_y)
minx = min(filter(lambda item: item[1] == maxy, dq), key=get_x)

就个人而言,我更喜欢生成器理解,但有些人发誓要使用这种代码。

我会解决这个问题的:

maxy=max(q[1] for q in dq)
minx=min((q[0],idx) for idx,q in enumerate(dq) if q[1]==maxy)
idx=minx[1]

我觉得它的可读性较差,但我需要少一次迭代。

谢谢@Kevin 和@Bhargav

另一种选择是将一个关键函数传递给max:

>>> max(enumerate(dq), key=lambda x: (x[1][1], -x[1][0]))
(11, (410, -410))
>>> idx, maxval = max(enumerate(dq), key=lambda x: (x[1][1], -x[1][0]))
>>> idx
11

在这里,我们处理数字的地方,我们可以使用符号翻转技巧来交换最小值和最大值。