Python 列表的布尔运算 - 结果不一致
Python boolean operations on lists - inconsistent results
假设我有两个列表:
>>> 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]
我做错了什么?
y or z
在单个元素上的表现与您想象的不同。相反,它计算第一个参数 (y
) 的 'truthiness'。由于 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)
]
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
假设我有两个列表:
>>> 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]
我做错了什么?
y or z
在单个元素上的表现与您想象的不同。相反,它计算第一个参数 (y
) 的 'truthiness'。由于 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)
]
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