Python 如何在坐标列表中找到角点?
我有以下代码的样式/性能问题:Python 如何在坐标列表中找到角点?,python,coordinates,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, -
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值的索引
有没有更好的/python式的方法来实现这一点?如果您更喜欢函数式代码:
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另一个选项是将关键功能传递给:
在这里,当我们处理数字时,我们可以使用符号翻转技巧来交换最小值和最大值。如果
dq=((3,2)、(4,3))
,您希望返回什么?现在,您将返回(4,3)
。对吗?@Kevin想象我有一个正方形:dq=((0,1),(1,1),(1,0),(0,0)
。我想返回idx=0
,因为dq在索引0处有一个元组,X值越低,Y值越大。@NicolaySnet但是Nicola在这个解决方案中,团队之间的承诺呈现了返回int或bool的趋势,允许维护结构体相对于其类的位置。为什么不呢将值minx和maxy倒置?很好!我认为这是最快的解决方案,最多使用Python的元组顺序。@NicolaySnet:如果性能是此类任务的一个问题,那么您使用的语言是错误的。:-)
>>> 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