python:验证条件和引发异常的最佳方法

时间:2011-02-16 11:21:55

标签: python exception if-statement

喜 我必须验证一个向量是否包含全0或1,如果没有引发异常:

def assert_all_zero_or_one(vector):
    if set(vector)=={0}: return 0
    if set(vector)=={1}: return 1
    raise TypeError

这个例外

assert_all_zero_or_one([1,1,1]) # return 1
assert_all_zero_or_one([0,0]) # return 0
assert_all_zero_or_one([1,0,1]) # raise TypeError

我不喜欢这个解决方案..用python有一个最好的方法吗?

5 个答案:

答案 0 :(得分:4)

我认为您的解决方案很好地传达了您的意图。你也可以这样做

def assert_all_zero_or_one(vector):
    if set(vector) not in ({0}, {1}): raise TypeError
    return vector[0]

因此,您只需构建一次set(vector),但我认为您的内容更容易理解。

答案 1 :(得分:4)

这是怎么回事?

def assert_all_zero_or_one(vector):
    if all(v==1 for v in vector): return 1
    elif all(v==0 for v in vector): return 0
    else: raise TypeError

我觉得很好看。

如果你喜欢简短而神秘的话:

def assert_all_zero_or_one(vector):
    a, = set(vector)
    return a

虽然这会给你一个ValueError而不是TypeError。

答案 2 :(得分:3)

def allOneOf(items, ids):
    first = items[0]
    if first in ids and all(i==first for i in items):
        return first
    else:
        raise TypeError()

assert_all_zero_or_one = (lambda vector: allOneOf(vector, set([0,1])))

答案 3 :(得分:1)

您也可以这样做。

import functools
import operator

def assert_all_zero_or_one(vector):
    if ((functools.reduce(operator.__mul__,vector) == 1) or (functools.reduce(operator.__add__,vector) == 0)):
            return vector[0]
    else:   
        raise TypeError("Your vector should be homogenous")

答案 4 :(得分:0)

def assert_all_zero_or_one(vector):
    if len(vector) == sum(vector):
        return True
    elif sum(vector) == 0:
        return True
    return False

这应该很好用。