<p>由于您希望返回一个与另一个相关联的值,因此我首先制作一个dict来表示该关联,然后使用<code>max</code>和一个过滤器进行选择:</p>
<pre><code>total_lists = {
totMin: minList,
totMax: maxList,
}
return total_lists[max(t for t in total_lists.keys() if t <= 20)]
</code></pre>
<p>如果<code>totMin</code>和<code>totMax</code>是各自列表中的值的总和,我将根本不使用这些变量,只使用<code>sum</code>使其更简单:</p>
<pre><code>return max((v for v in (minList, maxList) if sum(v) <= 20), key=sum)
</code></pre>
<p>(编辑)啊哈,和其他人一样,我完全没有意识到这里还有另外一组值。下面将把原始答案留给后人,但请按照我处理相关列表的方式进行编辑。有关异常处理的说明,请参见下文</p>
<hr/>
<p>在一般情况下,我可以通过构建一个“候选”值列表(即在所需范围内的值)然后返回其中的<code>max</code>来完成这类工作。对于只有两个值来说,这似乎有点过分,但我倾向于认为,任何时候你有多个值,你都应该把它们放在一个集合中。一旦您的值位于筛选列表中,就可以很容易地根据“此列表是否为空”和“此列表的最高元素是什么”对其进行推理,而无需对每个元素编写单独的<code>if</code>/<code>elif</code>检查:</p>
<pre><code>values = [v for v in (totMax, totMin) if v <= 20]
if not values:
raise ValueError("Both out of range")
return max(values)
</code></pre>
<p>因为在您的例子中,您可以假设<code>totMax</code>始终高于<code>totMin</code>,所以您可以假设<code>values</code>已排序,因此您可以选择只返回第一个元素,而不使用<code>max</code>。(这是一个有点棘手的问题,因为对于未来的代码编辑器来说,您取决于输入列表的顺序可能并不明显!)</p>
<pre><code>values = [v for v in (totMax, totMin) if v <= 20]
if not values:
raise ValueError("Both out of range")
return values[0] # this works because the original values were in descending order
</code></pre>
<p>请注意,如果您对为异常提供自定义文本并不挑剔,则可以将其作为一行:</p>
<pre><code># raises ValueError: 'max() arg is an empty sequence' if both values > 20
return max(v for v in (totMax, totMin) if v <= 20)
</code></pre>
<p>或者您可以在<code>try</code>/<code>except</code>中重写异常,而不是使用<code>if</code>:</p>
<pre><code>try:
return [v for v in (totMax, totMin) if v <= 20][0]
except IndexError:
raise ValueError("Both out of range")
</code></pre>
<p>最终,您选择哪一个选项取决于您对界面的要求以及您的风格偏好!(我个人倾向于使用<code>max</code>的一行。)</p>