2011-02-16 55 views
3

喜 我要验证一个矢量包含所有0或1,如果没有引发异常:蟒蛇:最好的方法来验证条件,提高异常

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

与此exceution

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?

+0

*我不喜欢的,如果落在*这是什么意思? – 2011-02-16 11:23:21

+0

你为什么要返回0或1?为什么不“假”和“真”? – 2011-02-16 11:23:30

+0

@felix:抱歉,英语不是我的第一个语言。 “如果下降”意味着我不喜欢如果之后如果等.. – nkint 2011-02-16 11:34:50

回答

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]))) 
4

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

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

所以你建立set(vector)只有一次,但我觉得你比较容易理解。

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而不是一个类型错误。

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

这应该很好地工作。

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")