Python 2.7 Python-强制列表中不出现bool

Python 2.7 Python-强制列表中不出现bool,python-2.7,Python 2.7,我想在Python2.7中检查字典是否满足我设置的一些限制。一个令人满意的例子是:{1:[2],2:[2,3],3:False,4:True},但是{1:[1,True]}不正常。我想禁止键映射到列表中的True或False。注意,我只想检测我的限制是否被违反,我不想处理这个案例 在开始时,我测试一个键是否映射到一个列表,如果它映射到一个列表,我测试是否有某个条目v:v==False或v==True,如果是这样,我会引发ValueError。然后我知道它不起作用,因为1==True是真的 我应该

我想在Python2.7中检查字典是否满足我设置的一些限制。一个令人满意的例子是:
{1:[2],2:[2,3],3:False,4:True}
,但是
{1:[1,True]}
不正常。我想禁止键映射到列表中的
True
False
。注意,我只想检测我的限制是否被违反,我不想处理这个案例

在开始时,我测试一个键是否映射到一个列表,如果它映射到一个列表,我测试是否有某个条目
v
v==False或v==True
,如果是这样,我会引发
ValueError
。然后我知道它不起作用,因为
1==True
是真的

我应该改为测试v为假还是v为真?你对如何实施这些限制有什么建议,还是你认为我的限制是一种坏习惯


背景:字典将状态/标签元组映射到NFA的后续状态,我将映射到
True
False
以立即接受/拒绝该单词。

您可以使用
isinstance

In [16]: isinstance(True, bool)
Out[16]: True

In [17]: isinstance(1, bool)
Out[17]: False
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
您也可以使用
is

In [18]: any(x is True or x is False for x in [True, 2])
Out[18]: True
带有
isinstance
的单行函数示例:

In [16]: isinstance(True, bool)
Out[16]: True

In [17]: isinstance(1, bool)
Out[17]: False
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

为了尊重duck类型,如果我不想让长度为的元素测试true,除了==true之外,我还将使用len()来测试它:

def issingle(v):
  try:
    len(v)
    return False
  except:
    return True

x=[2,3]
y=1

issingle(x) ->> False
issingle(y) ->> True

我喜欢这个想法,因为我不需要区分对错,谢谢