喜 我必须验证一个向量是否包含全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有一个最好的方法吗?
答案 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
这应该很好用。