【问题标题】:How to do logical and operation on list of bool objects list?如何对布尔对象列表进行逻辑和操作?
【发布时间】:2020-04-22 08:28:43
【问题描述】:

我有一个 bool 对象列表,如下所示:

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

我想咬一下那些列表并得到结果:

[False, False, True, False]

最好的方法是什么?

【问题讨论】:

  • 那不是位列表。那是bool 对象的列表。
  • @juanpa.arrivillaga 谢谢,我已经编辑了。

标签: python list logical-operators


【解决方案1】:

只要你使用布尔值,你可以zip然后使用all

data = [[True, True, True, False], [False, True, True, False], [False, False, True, True]]
result = [all(e) for e in zip(*data)]
print(result)

输出

[False, False, True, False]

【讨论】:

  • 这符合逻辑and,而不是按位&
  • 既然布尔值只是一位,那不就一样了吗?
  • 我知道,对于这种特殊情况,结果是相同的。但是由于这个问题特别问... ;-)
  • @schwobaseggl 谢谢,你都是我想要的正确答案。我已将问题标题和内容更改为bool objects,因此我选择此答案作为解决方案。
【解决方案2】:

您可以使用functools.reduce 和按位“与”operator.and_,以及典型的zip(*...) 换位模式:

from functools import reduce
from operator import and_

lst = [[True, True, True, False], [False, True, True, False], [False, False, True, True]]

[reduce(and_, x) for x in zip(*lst)]
# [False, False, True, False]

【讨论】:

  • 会,但它在语义上不正确,因为没有就地更新(不要将reduce 与就地混淆)。请注意,&&= 是两个完全不同的运算符。每种类型都可以随心所欲地重载它们。这对于许多类型来说,a = a & ba &= b 是等价的,纯粹是传统的。
【解决方案3】:

如果您想专门使用按位& 运算符,则可以将functools.reducezip 一起使用:

>>> from functools import reduce
>>> l = [[True, True, True, False], [False, True, True, False], [False, False, True, True]]
>>> [reduce(lambda x, y: x & y, lst) for lst in zip(*l)]
[False, False, True, False]

我们也可以创建自己的迷你函数来替换lambda

>>> def bitwise_and(x, y):
...     return x & y
...
>>> [reduce(bitwise_and, lst) for lst in zip(*l)]
[False, False, True, False]

或者只使用operator 模块,如@schwobaseggl's 答案所示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    相关资源
    最近更新 更多