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

时间:2015-02-12 14:51:26

标签: python coordinates

我对以下代码存在样式/性能问题:

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值最低的索引。

有没有更好的/ pythonic方式来做到这一点?

3 个答案:

答案 0 :(得分:2)

另一种选择是将关键功能传递给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

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

答案 1 :(得分:0)

如果您更喜欢功能性的代码:

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)

就个人而言,我更喜欢发电机理解,但有些人会发誓这种代码。

答案 2 :(得分:0)

我会解决这个问题:

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