<p>即使在澄清之后,你的规则仍然模棱两可。您需要先弄清楚要实现的规则,然后才能对该规则进行编码。</p>
<p>如果规则足够简单,那么您应该能够编写一个返回值越高匹配越好的函数。在这种情况下,您可以将该函数作为<code>key</code>传递给<code>max</code>(或者您可以<code>sorted</code>,或者<code>heapq.nlargest</code>,等等,具体取决于您的实际用例)。</p>
<p>例如,如果规则只是“X组件最大的对象是最好的”,正如Blckknght所说,那就是<code>distance*cos(angle)</code>。当然,除了你可能想要最大的正X或负X分量,所以它实际上是<code>abs(that)</code>。所以:</p>
<pre><code>def best(alist):
return max(alist, key=lambda dao: abs(dao[0] * math.cos(dao[1]))
</code></pre>
<p>(因为<code>list</code>的每个元素都是<code>distance, angle, object</code>的<code>list</code>,所以我将这些元素都称为<code>dao</code>,所以<code>dao[0]</code>是距离等。)</p>
<p>如果你不知道如何把规则变成一个单一的键函数呢?</p>
<p>好吧,如果你能写一个比较函数,它比较两个<code>dao</code>三元组并返回较大的一个,你可以用<a href="http://docs.python.org/2/library/functools.html#functools.cmp_to_key" rel="nofollow">^{<cd13>}</a>把它变成一个<code>key</code>函数。但实际上,您可以编写<code>cmp</code>函数但不能编写<code>key</code>函数并不是很常见。</p>
<p>如果你需要更复杂的东西,你总是可以预先过滤列表,或装饰-排序-取消装饰,等等</p>
<p>例如,在评论中,您会说:</p>
<blockquote>
<p>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.</p>
</blockquote>
<p>这是模棱两可的,但我们可以这样解释:</p>
<ul>
<li>如果有任何角度在[-90,90]范围内的对象,请从这些对象中选择最长的对象。</li>
<li>否则,选择角度最小的对象。</li>
</ul>
<p>我可以把它作为一个关键函数来写,但是假设我不知道怎么写,我想把所有的事情都说清楚。为<code>longest</code>编写一个键函数是很简单的——这只是<code>dao[0]</code>作为键。为<code>smallest angle</code>编写一个键函数也很简单——这只是<code>abs(dao[1])</code>。所以:</p>
<pre><code>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]))
</code></pre>