所以我有一份清单
alist = [[distance1,delta-angle1,object1],[distance2,delta-angle2,object2], [distance3,delta-angle3,object3],...]
我希望最大化“距离”并最小化“delta-angle”,它们是list
中每个alist
的前两个元素,并返回该特定列表。
警告:distance
将是一个浮点数,delta-angle
将以度数(-180:180)
目标是选择具有“最直”角度的最长距离,但不仅仅是最长或“最直”(也称为最小角度变化)
编辑:我无法上传图片,所以这里是一个链接。
http://imgur.com/a/b6KWM#YqGxdlu
我想在这个特殊情况下避免“回到我原来的地方”。 如第二张图片所示
图片2
第三幅图像是理想的 - 因为我还没有想到更好的方式来说明这一点:最小化角度与当前方位的变化(三角形角度已经存储在alist
中)并最大化distance
或可用线段的长度(此处由下图中边界上的端点表示)
答案 0 :(得分:1)
即使澄清之后,你的规则仍然含糊不清。在编写规则之前,您需要确定要实施的规则。
如果规则足够简单,您应该能够编写一个函数,该函数返回更高的值,匹配越好。在这种情况下,您可以将该功能作为key
传递给max
(或者您可以sorted
或heapq.nlargest
等,具体取决于您的实际使用情况是)。
例如,如果规则只是“具有最大X分量的对象是最好的”,正如Blckknght所说,那只是distance*cos(angle)
。当然,除了你可能想要最大的正或负X分量,所以它实际上是abs(that)
。所以:
def best(alist):
return max(alist, key=lambda dao: abs(dao[0] * math.cos(dao[1]))
(由于list
的每个元素都是list
的{{1}},因此我调用了每个元素distance, angle, object
,因此dao
是距离等。)
如果您无法弄清楚如何将规则转换为单个键功能怎么办?
好吧,如果您可以编写比较函数,比较两个dao[0]
三元组并返回较大的三元组,则可以使用functools.cmp_to_key
将其转换为dao
函数。但实际上,您可以编写key
函数但不能编写cmp
函数并不常见。
如果你需要更复杂的东西,你可以随时预先过滤列表,或者装饰 - 排序 - 不合理等。
例如,在评论中,您说:
最大的效用将来自于-90:0:90范围内的长线,而且无论距离多长,其他一切都没什么用处。
这是不明确的,但我们可以解释它的一种方式是:
我可以将其写为关键功能,但让我假装我不知道如何,并希望将一切都明确。为key
编写一个关键函数是很简单的 - 这只是longest
的关键。为dao[0]
编写一个关键函数也是微不足道的 - 那只是smallest angle
。所以:
abs(dao[1])
答案 1 :(得分:0)
alist = [[0,0,'b'],[-30,50,'a'],
[45,63,'d'],[100,170,'d'],
[-2,15,'p']]
def mM(L):
x,y,_ = zip(*L)
return (min(x),max(y))
print mM(alist)
结果
(-30, 170)