0

如果字典满足我设置的一些限制,我想检查 python 2.7。一个令人满意的例子是:{1:[2], 2: [2,3], 3:False, 4: True},但是{1:[1, True]}不行。我想禁止键映射到列表TrueFalse列表中的键。请注意,我只想检测是否违反了我的限制,我不想处理此案。

一开始我测试了一个键是否映射到一个列表,如果是,我测试我是否有一些条目v: v == False or v == True,如果有,我提出一个ValueError. 然后我才知道它不起作用,因为1 == True是真的。

我应该改为测试v is False or v is True吗?您对如何执行限制有建议,或者您认为我的限制是不好的做法?

背景:字典将状态/标签元组映射到 NFA 的后继状态,我映射到TrueFalse立即接受/拒绝这个词。

4

2 回答 2

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
于 2013-06-30T13:05:23.190 回答
0

为了尊重鸭子类型,如果我不希望元素的长度测试为真,我会使用 len() 进行测试,除了 == True:

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

x=[2,3]
y=1

issingle(x) ->> False
issingle(y) ->> True
于 2013-06-30T13:05:46.063 回答