如果字典满足我设置的某些限制,我想检查python 2.7。一个令人满意的例子是:{1:[2], 2: [2,3], 3:False, 4: True}
,但{1:[1, True]}
不正常。我想禁止密钥映射到列表中的True
或False
。请注意,我只想检测是否违反了我的限制,我不想处理此案。
一开始我测试了一个键是否映射到一个列表,如果是,我测试我是否有一些条目v
:v == False or v == True
,如果是,我会引发一个{{1} }。然后我才知道它不起作用,因为ValueError
是真的。
我应该改为测试1 == True
吗?您是否有关于如何执行限制的建议,或者您认为我的限制是不好的做法?
背景:字典将状态/标签元组映射到NFA的后继状态,并映射到v is False or v is True
和True
以立即接受/拒绝该字。
答案 0 :(得分:1)
您可以使用isinstance
:
In [16]: isinstance(True, bool)
Out[16]: True
In [17]: isinstance(1, bool)
Out[17]: False
您也可以使用is
:
In [18]: any(x is True or x is False for x in [True, 2])
Out[18]: True
isinstance
的单行函数示例:
In [21]: is_good = lambda d: not any(any(isinstance(x, bool) for x in l)
....: for l in d.values() if isinstance(l, list))
In [22]: d = {1:[2], 2: [2,3], 3:False, 4: True}
In [23]: is_good(d)
Out[23]: True
In [24]: d[1][0] = False
In [25]: is_good(d)
Out[25]: False
同一功能的更明确版本:
def is_good(d):
for v in d.values():
if isinstance(v, list):
for x in v:
if isinstance(v, bool):
return False
return True
答案 1 :(得分:0)
为了尊重duck-typing,如果我不想要测试长度为true的元素,我会测试一下,使用len(),除了== True:
def issingle(v):
try:
len(v)
return False
except:
return True
x=[2,3]
y=1
issingle(x) ->> False
issingle(y) ->> True