区分假和0

时间:2016-11-16 19:28:23

标签: python

我有一个愚蠢但问题。 假设我有一个包含不同值的列表。像这样:

[1,2,3,'b', None, False, True, 7.0]

我想迭代它并检查每个元素是否都不在某些禁用值的列表中。例如,此列表为[0,0.0]

当我检查[0,0.0]中是否为假时,我得到True。我知道python在这里将False强制转换为0。 但是我如何能够避免它并使此检查正确 - False值不在[0,0.0]列表中?

3 个答案:

答案 0 :(得分:13)

要说明False0之间的区别,您可以使用is来比较它们。 False是单例值,始终引用同一个对象。要比较列表中的所有项目以确保它们不是False,请尝试:

all(x is not False for x in a_list)
顺便说一下,Python在这里没有任何东西:布尔值是整数的子类,而False实际上等于0,不需要转换。

答案 1 :(得分:2)

比较时,您可能希望使用is代替==

y = 0
print y == False # True
print y is False # False

x = False
print x == False # True
print x is False # True

答案 2 :(得分:0)

在今天区分0和False时发现了一个奇怪的极端情况。如果初始列表包含Falsenumpy.bool_(False))的数字版本,则is比较don't work,因为numpy.bool_(False) is not False

在使用numpy类型的比较中,这些总是出现。例如:

>>> type(numpy.array(50)<0) 
<class 'numpy.bool_'>

最简单的方法是使用numpy.bool_类型进行比较:(np.array(50)<0) is (np.False_)。但是,这样做需要numpy依赖性。我想出的解决方案是进行字符串比较(从numpy 1.18.1开始工作):

str(numpy.bool_(False)) == str(False)

因此,在处理列表时,应为@kindall:

all(str(x) != str(False) for x in a_list)

请注意,此测试的字符串'False'也存在问题。为避免这种情况,您可以排除字符串表示形式等同于其自身的情况(这也会避开numpy字符串数组)。这是一些测试输出:

>>> foo = False
>>> str(foo) != foo and str(foo) == str(False)
True

>>> foo = numpy.bool_(False)
>>> str(foo) != foo and str(foo) == str(False)
True

>>> foo = 0
>>> str(foo) != foo and str(foo) == str(False)
False

>>> foo = 'False'
>>> str(foo) != foo and str(foo) == str(False)
False

>>> foo = numpy.array('False')
>>> str(foo) != foo and str(foo) == str(False)
array(False)

我并不是真正的专家程序员,因此可能仍然缺少一些限制,或者没有这样做的一个重要原因,但这使我能够区分0和False,而不必求助于numpy依赖项。