2011-02-16 54 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")