我有一个愚蠢但问题。 假设我有一个包含不同值的列表。像这样:
[1,2,3,'b', None, False, True, 7.0]
我想迭代它并检查每个元素是否都不在某些禁用值的列表中。例如,此列表为[0,0.0]
。
当我检查[0,0.0
]中是否为假时,我得到True
。我知道python在这里将False
强制转换为0
。
但是我如何能够避免它并使此检查正确 - False
值不在[0,0.0]
列表中?
答案 0 :(得分:13)
要说明False
和0
之间的区别,您可以使用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
时发现了一个奇怪的极端情况。如果初始列表包含False
(numpy.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依赖项。