任务:鉴于此代码:
def normalize(lst):
s = sum(lst)
return list(map(lambda v: v / s, lst))
此代码适用于:
normalize([1, 2, 5, 4])
但不是为了这个(由于零除):
normalize([1, 2, -7, 4])
如果不修改normalize函数,请在safe_normalize函数中实现此策略,以便:
safe_normalize([1, 2, -5, 2])
给出
[1, 2, -5, 2]
我尝试过但却失败了:
def safe_normalize(lst):
def normalize(lst):
s = sum(lst)
if s == o:
return s
elif s!= 0:
new_s = s
return list(map(lambda v: v / new_s, lst))
return normalize(lst)
答案 0 :(得分:3)
如果你不能修改normalize,但你认为它是给定的,你可以在try中包含对它的调用,除非是块,如果出现ZeroDivisioneError,则返回输入列表。
def safe_normalize(lst):
try:
return normalize(lst)
except ZeroDivisionError:
return lst
答案 1 :(得分:2)
好老or
- 成语:
def safe_normalize(lst):
s = sum(lst) or 1
return list(v/s for v in lst)
偏离主题,但请注意生成器表达式如何更具可读性。列表理解甚至更好:
[v/s for v in lst]
答案 2 :(得分:0)
您还可以添加标志以强制安全并捕获异常。
此外,在python 2.7中,您将得到整数除法。如果您不想这样,那么添加一个浮点转换。此外,在2.7中,对list()
的调用是无关紧要的,因为map()
无论如何都会返回一个列表。您可能希望在客户端代码中添加列表调用。
def normalize(lst, safe=False):
s = sum(lst);
try:
return map(lambda v: float(v)/s, lst)
except ZeroDivisionError:
if safe:
return lst
else:
raise
print(normalize([1,2,3,4]))
print(normalize([1,2,3,-6], safe=True))
print(list(normalize([1,2,3,-6], safe=True)))
for item in normalize([1,2,3,-6], safe=True):
print(item)