我对以下代码存在样式/性能问题:
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方式来做到这一点?
答案 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