Как сделать логику и работу со списком объектов bool? - PullRequest
1 голос
/ 22 апреля 2020

У меня есть список bool объектов списка, таких как:

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

Я хочу разбить эти списки и получить результат:

[False, False, True, False]

Что лучше способ сделать это?

Ответы [ 3 ]

3 голосов
/ 22 апреля 2020

Пока вы используете логическое значение, вы можете zip , а затем использовать все :

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]
2 голосов
/ 22 апреля 2020

Вы можете использовать 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]
1 голос
/ 22 апреля 2020

Если вы хотите специально использовать побитовый оператор &, то вы можете использовать functools.reduce с zip:

>>> 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 .

...