python中布尔列表的And/Or elementalwise

2024-05-16 21:14:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python中有两个布尔列表:

l1 = [True, False, True]
l2 = [False, True, True]

我希望对它们进行基本的比较和/或分析。我希望得到:

l3 = [False, False, True] # elemental-wise And
l4 = [True, True, True] # elemental-wise Or

所以我简单地说:

l3 = l1 and l2
l4 = l1 or l2

但结果意外地表现为:

l3=[False, True, True] (which is l2)
l4=[True, False, True] (which is l1)

我怎样才能做到元素上的比较又好又干净


Tags: orandfalsetruel1which列表is
2条回答

您可以在列表理解中使用内置的^{}^{}方法:

l1 = [True, False, True]
l2 = [False, True, True]

l3 = [all(z) for z in zip(l1, l2)]
l4 = [any(z) for z in zip(l1, l2)]

print(l3)
print(l4)

输出

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

您还可以使用内置的^{}方法:

l1 = [True, False, True]
l2 = [False, True, True]

l3 = map(all, zip(l1, l2))
l4 = map(any, zip(l1, l2))

print(list(l3))
print(list(l4))

输出:

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

您可以使用列表理解

l3 = [(i and j) for i,j in zip(l1,l2)]
l4 = [(i or j) for i,j in zip(l1,l2)]

当你在做

l3 = l1 and l2
l4 = l1 or l2

然后它就变成了

l3 = bool(l1) and l2
l4 = bool(l1) or l2

既然l1是非空列表,那么 bool(l1) = True

现在,我假设在l3 = l1 and l2的情况下,l1被计算为True,因此对于short circuit evaluation,它返回l2

l4 = l1 or l2的情况下,同样由于short circuit evaluation,返回l1,因为l1True

所以,你得到的结果是这样的。 short circuit evaluation不过是

  1. A and B的情况下,如果A的计算结果为True,则继续计算B并返回B的结果。如果A的计算结果为False,则不计算B。返回A的结果
False and print('hello')
>>> False
True and print('hello')
>>> hello
  1. A or B的情况下,如果A的计算结果为True,那么计算B没有意义。只需返回A的结果。如果A的计算结果为False,则返回B的结果
True or (1/0)
>>> True
False or (1/0)
>>> ZeroDivisionError: division by zero

注:

bool([]) = False
bool([1,2,'a']) = True
bool(['False']) = True

相关问题 更多 >