在列表列表python中查找[max,min]值

2024-04-29 11:23:26 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一张单子

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或长度(这里由下图中边界上的端点表示)

图3 http://imgur.com/a/b6KWM#YqGxdlu


Tags: comhttp元素距离单子distance角度delta
2条回答
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)

即使在澄清之后,你的规则仍然模棱两可。您需要先弄清楚要实现的规则,然后才能对该规则进行编码。

如果规则足够简单,那么您应该能够编写一个返回值越高匹配越好的函数。在这种情况下,您可以将该函数作为key传递给max(或者您可以sorted,或者heapq.nlargest,等等,具体取决于您的实际用例)。

例如,如果规则只是“X组件最大的对象是最好的”,正如Blckknght所说,那就是distance*cos(angle)。当然,除了你可能想要最大的正X或负X分量,所以它实际上是abs(that)。所以:

def best(alist):
    return max(alist, key=lambda dao: abs(dao[0] * math.cos(dao[1]))

(因为list的每个元素都是distance, angle, objectlist,所以我将这些元素都称为dao,所以dao[0]是距离等。)

如果你不知道如何把规则变成一个单一的键函数呢?

好吧,如果你能写一个比较函数,它比较两个dao三元组并返回较大的一个,你可以用^{}把它变成一个key函数。但实际上,您可以编写cmp函数但不能编写key函数并不是很常见。

如果你需要更复杂的东西,你总是可以预先过滤列表,或装饰-排序-取消装饰,等等

例如,在评论中,您会说:

the most utility would come from long lines that fall in a range of -90:0:90 and everything else being of little utility no matter how long the distance is.

这是模棱两可的,但我们可以这样解释:

  • 如果有任何角度在[-90,90]范围内的对象,请从这些对象中选择最长的对象。
  • 否则,选择角度最小的对象。

我可以把它作为一个关键函数来写,但是假设我不知道怎么写,我想把所有的事情都说清楚。为longest编写一个键函数是很简单的——这只是dao[0]作为键。为smallest angle编写一个键函数也很简单——这只是abs(dao[1])。所以:

def best(alist):
    acutes = [[d, a, o] for [d, a, o] in alist if abs(a) <= 90]
    if acutes:
        return max(acutes, key=lambda dao: dao[0])
    else:
        return min(alist, key=lambda dao: abs(dao[1]))

相关问题 更多 >