所以我有一张单子
alist = [[distance1,delta-angle1,object1],[distance2,delta-angle2,object2], [distance3,delta-angle3,object3],...]
我想最大化“距离”和最小化“三角角”,这是每个list
元素在alist
中的前两个元素,并返回该特定列表。
注意:distance
是一个浮点数,delta-angle
是度数(-180:180)
目标是用“最直”的角度来选择最长的距离,但不只是最长的或“最直的”(也就是说角度的最小变化)
编辑:我不能上传图片,所以这里有一个链接。
http://imgur.com/a/b6KWM#YqGxdlu
我想避免在这个特殊情况下“回到我原来的地方”。 如第二幅图所示
图2
第三幅图是理想的,因为我还没有想出更好的方法来说明这一点:最小化与当前方位的角度变化(三角角已经存储在alist
中)并最大化可用线段的distance
或长度(这里由下图中边界上的端点表示)
结果
即使在澄清之后,你的规则仍然模棱两可。您需要先弄清楚要实现的规则,然后才能对该规则进行编码。
如果规则足够简单,那么您应该能够编写一个返回值越高匹配越好的函数。在这种情况下,您可以将该函数作为
key
传递给max
(或者您可以sorted
,或者heapq.nlargest
,等等,具体取决于您的实际用例)。例如,如果规则只是“X组件最大的对象是最好的”,正如Blckknght所说,那就是
distance*cos(angle)
。当然,除了你可能想要最大的正X或负X分量,所以它实际上是abs(that)
。所以:(因为
list
的每个元素都是distance, angle, object
的list
,所以我将这些元素都称为dao
,所以dao[0]
是距离等。)如果你不知道如何把规则变成一个单一的键函数呢?
好吧,如果你能写一个比较函数,它比较两个} 把它变成一个
dao
三元组并返回较大的一个,你可以用^{key
函数。但实际上,您可以编写cmp
函数但不能编写key
函数并不是很常见。如果你需要更复杂的东西,你总是可以预先过滤列表,或装饰-排序-取消装饰,等等
例如,在评论中,您会说:
这是模棱两可的,但我们可以这样解释:
我可以把它作为一个关键函数来写,但是假设我不知道怎么写,我想把所有的事情都说清楚。为
longest
编写一个键函数是很简单的——这只是dao[0]
作为键。为smallest angle
编写一个键函数也很简单——这只是abs(dao[1])
。所以:相关问题 更多 >
编程相关推荐