2013-02-12 104 views
-1

所以我有一个列表的列表找到[最大值,最小值在列表蟒列表值

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

我想避免“回去我在那里”在这种特殊情况下。 作为第二图像中所示

IMAGE 2

第三图像是理想的 - 并且由于我还没有想到的一个更好的方式来说明这一点:最小化从当前轴承的角度变化(其Δ-角度是什么被存储在alist已经),增加可用线段的distance或长度(在下面的图片这里表示由上边界端点)

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

+5

您定义的“最长距离与最直角”非常模糊 - 您能定义一个效用函数吗?如果你有一对元素,你怎么能决定哪一个更好? – 2013-02-12 00:51:45

+2

直到你真正给出了一个选择哪一个更好的特定公式,你才能真正得到答案。有了这些之后,您可以在指定密钥时使用排序。 (更多阅读:http://wiki.python.org/moin/HowTo/Sorting/) – placeybordeaux 2013-02-12 01:01:42

+0

此外,为什么你认为你需要“把[角度]放在[0 ... 360]的范围内”最小化它?你真的想要89°被认为比-45°更小吗?如果不是,则将其保留为[-180,180],并将“abs(角度)”而不是“角度”最小化。 – abarnert 2013-02-12 01:07:48

回答

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) 
+0

我不认为提问者需要单独的最大值和最小值,而是单独的最大值/最小值的组合。 – Blckknght 2013-02-12 01:13:35

+0

这是正确的 - 我想(最大化,最小化)。 – 2013-02-12 01:23:51

+0

@ user1124683你有一种难以理解的表达方式。这是一个问题 – eyquem 2013-02-12 02:58:41

1

即使在澄清后,您的规则尚不明确。在编写规则之前,你需要弄清楚你想要实现的规则。

如果规则很简单,您应该可以编写一个返回更高值的函数,匹配得越好。在这种情况下,您只需将该函数作为key传递给max(或者您可以sortedheapq.nlargest等,这取决于您的实际使用情况)。

例如,如果规则只是“具有最大X分量的对象是最好的”,正如Blckknght所说,那只是distance*cos(angle)。当然,除了您可能需要最大的正向或负向X分量外,实际上它是​​。所以:

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

(由于list的每个元素的distance, angle, object一个list,我每次叫这些元素dao的,所以dao[0]是距离等)

,如果你可以”是什么不知道如何将规则转换为单个按键功能?

那么,如果你可以编写一个比较函数,比较两个dao三元组并返回更大的三元组,你可以使用functools.cmp_to_key将它变成key函数。但是,真的,你可以编写一个cmp函数,但不能写一个key函数并不常见。

如果你需要更复杂的东西,你总是可以预过滤器列表,或装饰排序,去除装饰等

例如,在一个评论,你说:

的大多数效用来自长线,落在-90:0:90的范围内,无论距离多长,其他一切效用都不大。

这是模糊的,但我们可以把它解释的一种方法是:

  • 如果在区间[-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]))