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