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

时间:2013-02-12 00:48:18

标签: python list max min

所以我有一份清单

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或可用线段的长度(此处由下图中边界上的端点表示)

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

2 个答案:

答案 0 :(得分:1)

即使澄清之后,你的规则仍然含糊不清。在编写规则之前,您需要确定要实施的规则。

如果规则足够简单,您应该能够编写一个函数,该函数返回更高的值,匹配越好。在这种情况下,您可以将该功能作为key传递给max(或者您可以sortedheapq.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范围内的长线,而且无论距离多长,其他一切都没什么用处。

这是不明确的,但我们可以解释它的一种方式是:

  • 如果有任何角度在[-90,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)