【问题标题】:Differentiate False and 0区分 False 和 0
【发布时间】:2016-11-16 19:28:22
【问题描述】:

假设我有一个包含不同值的列表,如下所示:

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

我想对其进行迭代并检查每个元素是否不在某些禁止值列表中。例如,这个列表是[0,0.0]

当我检查 [0,0.0 是否为 False 时,我得到 True。我知道 python 在这里将False 转换为0 - 但我怎样才能避免它并使这个检查正确 - False 值不在[0,0.0] 中?

【问题讨论】:

  • 列表将被评估为 True。检查this question
  • 您应该单独检查这些值,您的方法最多只能向您显示某些失败,但不会告诉您什么是您或您的用户的下一个问题。
  • 您可能需要重新考虑导致列表包含需要区别对待的False0 值的决定。
  • @chepner 实际上你是对的,我在从 codewars 解决 kata 时遇到了这个问题。 :)

标签: python


【解决方案1】:

要区分False0,您可以使用is 来比较它们。 False 是一个单例值并且总是引用同一个对象。要比较列表中的所有项目以确保它们不是 False,请尝试:

all(x is not False for x in a_list)

顺便说一句,Python 不会在这里转换任何东西:布尔值是整数的子类,False 实际上等于0,不需要转换。

【讨论】:

    【解决方案2】:

    比较时您可能希望使用is 而不是==

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

    【讨论】:

    • 好建议,但原始代码不包含==,它包含in。这不是问题的真实答案。
    • 所以吸取的教训是,为了比较两个逻辑,应该使用isis not 而不是==
    • @wander95 如果您真的需要知道False0 之间的区别,那么可以。 True1 也是。大多数时候你不需要区分。 in 使用 == 并且无法更改。
    【解决方案3】:

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

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

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

    最简单的方法是使用numpy.bool_ 类型进行比较:(np.array(50)&lt;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依赖。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-18
      • 2018-01-17
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 2021-11-03
      • 2011-08-23
      • 2011-01-24
      相关资源
      最近更新 更多