如何规范化列表以使其适用于所有情况

时间:2014-03-23 08:35:46

标签: python list

任务:鉴于此代码:

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)

3 个答案:

答案 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)