any() 和 all() 函数的意外结果,如何将字符串读取为 false?[复制]

Unexpected results from any() and all() functions, and how do I read strings as false? [duplicate]

提问人:amquack 提问时间:1/30/2021 更新时间:1/30/2021 访问量:44

问:

我正在测试 all() 和 any() 函数,以确保我了解它们的操作方式。原来我不理解他们。这是我的测试代码:

v1=[True, False, True] # unexpected 2
v2=[True]              # wai
v3=[]                  # unexpected 2
v4=[False]             # wai
v5=[False,False]       # wai
v6=[False,False, True] # unexpected 2
v7=[False]*4           # wai
v8=[float('nan'),False]# unexpected 1, but I think this is because any() considers "truthy" values. Given this, 2 is unexpected.
v9=['f','t']           # wai, given "truthy" values. Would like this to return False.
v10=['random_string']  # same as above
vlist=[v1,v2,v3,v4,v5,v6,v7,v8,v9,v10]

for v in vlist:
    print('any true:',any(v)==True,'| not all false:',not(all(v)==False),'(',v,')')

返回:

any true: True | not all false: False ( [True, False, True] )
any true: True | not all false: True ( [True] )
any true: False | not all false: True ( [] )
any true: False | not all false: False ( [False] )
any true: False | not all false: False ( [False, False] )
any true: True | not all false: False ( [False, False, True] )
any true: False | not all false: False ( [False, False, False, False] )
any true: True | not all false: False ( [nan, False] )
any true: True | not all false: True ( ['f', 't'] )
any true: True | not all false: True ( ['random_string'] )

我在这里对输出进行了编码以显示语句的逻辑摘要(例如:任何 true),然后是计算值。这是对两个语句执行的,然后末尾的括号显示计算的列表。

我的大部分惊喜都来自这种组合。但我也期望非真值(例如:float('nan')或'random_string')是假的。查看文档,我发现情况并非如此,但我想知道如何将其作为一种选择。not all()

我试图对逻辑语句进行编码测试:“Is any True?”和“not: are all False?”。如果我没记错的话,这些在逻辑上应该是相同的。

对我的惊喜有一些更详细的解释。我把“内部”陈述称为外部陈述,并否定这一点:all(v)==False

  • v1=[True, False, True]- 对于内部语句,我考虑是否所有元素都是 False。显然不是这样,所以我预计这种说法是错误的。外部否定了这一点,所以这个结果应该是 True。not
  • v3=[]- 该集合是空的。因此,所有元素都是假的就是真,而不是这应该是假的。
  • v6=[False,False, True]- 很明显,有一些 True 元素,所以内部语句是 False。不是这样,意味着它应该是真的。
  • v8=[float('nan'),False]- 这对我来说是一个难题。我希望“nan”读作 False(只接受 True 值),但查看文档,这不是它的工作原理。根据这条信息,第二个语句读作 False 是出乎意料的,因为“nan”是一个“真实”值。所以所有元素都是 False 是一个错误的陈述,并且否定了我希望输出为 True。
  • v9一旦我了解了“真实”的价值观,就会按预期工作。但是,我希望它们在这两种情况下都读取 False(仅考虑 或作为 True 值,其他值为 False)。我目前的项目特别关注的是将“nan”、“NaN”等读作 False。v101True
python 布尔 逻辑运算符 boolean-logic

评论

2赞 juanpa.arrivillaga 1/30/2021
not(all(v)==False)并不意味着“不全是假的”。同样是多余的,它意味着只是.any(v) == Trueany(v)
1赞 juanpa.arrivillaga 1/30/2021
“我希望'nan'读作 False”好吧,我想要很多东西,但不是假的,唯一的假是 .nanfloat0.0
1赞 juanpa.arrivillaga 1/30/2021
好吧,罗嗦的方式是,但实际上,你只是想要(即任何真,至少一个真与不全是假相同)not all(not x for x in v)any(v)
1赞 Barmar 1/30/2021
听起来你需要学习德摩根定律
1赞 juanpa.arrivillaga 1/30/2021
是的,你真的需要了解德摩根定律。但是你把python当成自然语言英语,不分布在项目之间,然后使用,相反,它先使用,然后检查它是否是假的,这基本上只是一个双重否定。 只是not(all(v)==False)== Falsevallallnot (....)not (all(v) == False)all(v)

答: 暂无答案