如何在坐标列表中找到一个角?
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
在这里,我们处理数字的地方,我们可以使用符号翻转技巧来交换最小值和最大值。
我对以下代码有一个 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
在这里,我们处理数字的地方,我们可以使用符号翻转技巧来交换最小值和最大值。