Python中非无的最小数
这个问题和我的问题很接近,但不完全一样。我需要考虑列表中所有值都可能为无 我有一种情况,我必须在数据库中查找一些数字,它们可能存在或返回为空。我需要找到这些现有数字的最小值。例如:Python中非无的最小数,python,minimum,Python,Minimum,这个问题和我的问题很接近,但不完全一样。我需要考虑列表中所有值都可能为无 我有一种情况,我必须在数据库中查找一些数字,它们可能存在或返回为空。我需要找到这些现有数字的最小值。例如: min_if_exists(1, 2) returns 1 min_if_exists(5, None) returns 5 min_if_exists(None, None) returns None 幸运的是,我可以这样做: def min_if_exists(a, b): return min(a,
min_if_exists(1, 2) returns 1
min_if_exists(5, None) returns 5
min_if_exists(None, None) returns None
幸运的是,我可以这样做:
def min_if_exists(a, b):
return min(a, b)
elif a:
return a
elif b:
return b
else:
return None
以下是对上述问题的答复:
lowest = min(x for x in (a, b) if x is not None)
然而,如果a和b都没有,我会得到一个异常,因为我输入了一个空序列。我可以简单地捕获异常,也可以在序列中包含任意大的数字(a、b、100000000)。对于一个任意长的数字序列,可能都是无的,我可以(大概)反Python地这样做:
def min_if_exists(list_of_nums):
not_a_none_exists = False
for n in list_of_nums:
if n is not None:
not_a_none_exists = True
if not_a_none_exists:
return min(x for x in list_of_nums if x is not None)
else:
return None
有没有一种更具python风格、更简洁的方法呢?试试看,这是一种python风格的解决方案:
def min_if_exists(list_of_nums):
try:
return min(x for x in list_of_nums if x is not None)
except ValueError:
return None
记住:在Python中,请求原谅比请求允许更容易!引述:
这种常见的Python编码风格假设存在有效的键或属性,如果假设为false,则捕获异常。这种简洁快速的风格的特点是有许多尝试和例外的陈述。这种技术与许多其他语言(如C)所共有的LBYL(三思而后行)风格形成了对比
我认为Oscar Lopez基于异常处理的回答是一个非常好的选择。这里有一个备选方案(可能较差):
如果您等待Python3.4,您可以非常清楚地执行此操作,因为
min
和max
将增加一个默认参数(请参阅问题):
您可以相当快地取消捕获异常的选项。在我看来,考虑到“与其请求允许,不如去做并请求原谅”的一般哲学,这似乎是一种类似于Python的方法。就我个人而言,我不喜欢这种方法,原因有两个:我必须记住或查找异常名称(
例外除外
是不可接受的),第二个原因就是打字更难。在某些情况下,请求原谅看起来更干净,但在这种情况下就不行了。但这是品味的问题。是否有一个一般的经验法则来确定何时应该编写会经常引发异常的代码(前提是您能够处理它)?比如当它是最短的解决方案时(以代码行度量)?我可以看到在某些情况下捕获异常是如何失控的,比如可能会抛出几个异常。在这种情况下,我想我必须同意你的观点,简单地捕捉异常是最干净的方法。@JosephKriefall我想不出一个经验法则。当您觉得这样做可以简化代码时,为控制流捕获异常-如果我们要验证可能导致异常的每个情况并进行处理,那么代码很快就会变得笨拙
def my_min(lst):
if lst == [None]*len(lst):
return None
else:
return min(x for x in lst if x is not None)
print(my_min([0,2,-1])) # -1
print(my_min([0,2,None])) # 0
print(my_min([None, None, None])) # None
>>> def min_not_none(seq):
... return min((x for x in seq if x is not None), default=None)
...
>>> print(min_not_none([3,None,1]))
1
>>> print(min_not_none([None]))
None