我的任务是创建一个无需使用min()函数即可从列表中返回最小数字的函数。当我运行以下代码时,它返回0而不是-1。我不太清楚为什么。注意:1. fancy_min仅返回给定两个参数之间的较小数字。 2.如果列表为空,或者参数为无,我想返回无。
def minimum_of(numbers):
mini = 99999999
if numbers == []:
return None
elif numbers is None:
return None
for i in range(len(numbers)-1):
m = fancy_min(numbers[i], numbers[i+1])
if m<mini:
return m
print(minimum_of([-1,3,None,2,1,]))
def fancy_min(a, b):
while a is None:
return b
while b is None:
return a
if a > b:
return b
elif b > a:
return a
答案 0 :(得分:1)
您的代码返回最后两个数字的最小值。试试这个:
def fancy_min(a, b):
if a is None:
return b
if b is None:
return a
if a > b:
return b
elif b > a:
return a
def minimum_of(numbers):
mini = 99999999
if numbers == []:
return None
elif None in numbers:
return None
for i in range(len(numbers)):
mini = fancy_min(numbers[i], mini)
return mini
答案 1 :(得分:0)
您实际上并不需要两个函数,并且None
列表项约束可以使用内置函数filter
更加简洁地处理。
def new_min(l=None):
if not l:
return None
m = None
for n in filter(lambda x: x is not None, l):
if (m is None) or (n < m):
m = n
return m
运行示例数据:
new_min([-1,3,None,2,1,])
> -1
new_min([None, None]) is None
> True
new_min(None) is None
> True
new_min() is None
> True
如果您想在上面的链接中更深入一点,您也可以通过这种方式获得最小值(尽管这忽略了参数本身为None
或不包含非None
的情况值):
reduce(
lambda a, b: a if (a < b) else b,
filter(lambda x: x is not None, l)
) or None