列表上的 Python 布尔运算 - 结果不一致

Posted

技术标签:

【中文标题】列表上的 Python 布尔运算 - 结果不一致【英文标题】:Python boolean operations on lists - inconsistent results 【发布时间】:2017-09-28 21:24:08 【问题描述】:

假设我有两个列表:

>>> y
[False, False, True, False, True, False, False, True, False, True, False, False]
>>> z
[False, True, True, True, True, True, False, False, False, False, False, True]

然后我执行以下操作:

>>> y or z
[False, False, True, False, True, False, False, True, False, True, False, False]
>>> z or y
[False, True, True, True, True, True, False, False, False, False, False, True]

正确答案不应该如下图吗?

[False, True, True, True, True, True, False, True, False, True, False, True]

and 我也得到了不正确的答案:

>>> y and z
[False, True, True, True, True, True, False, False, False, False, False, True]
>>> z and y
[False, False, True, False, True, False, False, True, False, True, False, False]

我测试了 1 和 0,结果很奇怪:

>>> y=[0,0,0,0,0]
>>> z=[1,1,1,1,1]
>>> y or z
[0, 0, 0, 0, 0]
>>> z or y
[1, 1, 1, 1, 1]
>>> y and z
[1, 1, 1, 1, 1]
>>> z and y
[0, 0, 0, 0, 0]

我做错了什么?

【问题讨论】:

尝试将您的列表包装在像 bool([False]) 这样的布尔调用中,以了解为什么会发生这种情况 正如答案所暗示的,or 不能以这种方式工作。然而numpy.logical_or 确实像这样工作,所以可能对你有用。 docs.scipy.org/doc/numpy/reference/generated/… 【参考方案1】:

y or z 在单个元素上的行为与您想象的不同。相反,它评估第一个参数 (y) 的“真实性”。由于y 是一个非空列表,它的计算结果为真。然后整个语句的计算结果为y

同样,z or y 首先查看 z 是否为真(确实如此,因为它是一个非空列表)。因此,该语句的计算结果为 z,而无需查看 y 或其中的元素。

这里有一些更清晰的例子:

>>> [1,2,3,4] or [5,6,7,8]
[1, 2, 3, 4]
>>> ['this','is','a','list'] or ['and','here','is','another']
['this', 'is', 'a', 'list']

一个空列表的计算结果为“false-y”,因此在这种情况下,右侧列表是语句的值:

>>> [] or ['and','here','is','another']
['and', 'here', 'is', 'another']

交换列表的顺序表明第一个评估为真的将是结果:

>>> ['and','here','is','another'] or ['this','is','a','list']
['and', 'here', 'is', 'another']

为了实现你想要的,你可以做一个列表理解,比如

[
    y_item or z_item
    for y_item, z_item
    in zip(y, z)
]

【讨论】:

[any(items) for items in zip(y,z)] 使用 any 返回布尔值而不是“真实”列表值本身,这可能是也可能不是 OP 想要的。【参考方案2】:

or操作的正确做法:

[a or b for a, b in zip(y, z)]

and操作的正确做法:

[a and b for a, b in zip(y, z)]

None, False, 0, '', (), [], and few more(此处提到 -> Truth Value Testing)被视为False

这里有一些例子:

[]False[False]True 因为它不为空,请检查使用 bool([False])

>>> [] and [False]
[]
>>> bool([] and [False])
False

[]False[False]True,因此这里是 True

>>> [] or [False]
[False]
>>> bool([] or [False])
True

【讨论】:

以上是关于列表上的 Python 布尔运算 - 结果不一致的主要内容,如果未能解决你的问题,请参考以下文章

Python append() 与列表上的 + 运算符,为啥这些会给出不同的结果?

Python append() 与列表上的 + 运算符,为啥这些会给出不同的结果?

python中的布尔列表操作[重复]

Python--Demo5--布尔类型相关操作

python-逻辑运算:not\and\or和布尔值:True\False

python基础入门学习2