22

Например, если у вас есть n списков bools с одинаковой длиной, то elementwise boolean AND должен возвращать другой список этой длины, который имеет True в тех положениях, где все входные списки имеют True, а False - везде.Существуют ли встроенные функции для элементарных булевых операторов над булевыми списками?

Это очень легко написать, я бы предпочел использовать встроенный, если он существует (для стандартизации/удобочитаемости).

Вот реализация поэлементно И:

def eAnd(*args): 
    return [all(tuple) for tuple in zip(*args)] 

Пример использования:

>>> eAnd([True, False, True, False, True], [True, True, False, False, True], [True, True, False, False, True]) 
[True, False, False, False, True] 

ответ

17

Существует не встроенный способ сделать это. Вообще говоря, понимание списков и т. П. - это то, как вы выполняете элементарные операции в Python.

Numpy действительно предоставляет это (с использованием &, для технических ограничений) в своем типе массива. Частотные массивы обычно выполняют операции по элементам.

1

Нет, нет таких Модульное. Ваш метод с использованием zip и all/any - это то, что я хотел бы использовать.

1

Нет, я не верю, что в стандартной библиотеке есть такая функция ... особенно когда ее легко написать с точки зрения предоставляемых функций.

2

numpy.all функция делает то, что вы хотите, если вы указываете размер, чтобы свернуть на:

>>> all([[True, False, True, False, True], [True, True, False, False, True], [True, True, False, False, True]], 0) 
array([ True, False, False, False, True], dtype=bool) 
+0

Параметр 'all' функция, которую вы имеете в виду не встроенная функция; это 'numpy.all'. – DSM

+0

Спасибо - отредактирован, чтобы это отразить. – Tom

12

Try:

[ x&y for (x,y) in zip(list_a, list_b)] 
+0

для меня это кажется действительно pythonic, и вам также не нужно импортировать numpy – NiCU

+0

Если это вообще возможно, я бы по-прежнему рекомендовал numpy, хотя и на порядок быстрее, а синтаксис еще проще читать: arr1 & arr2 дает вам массив результатов. – Zak

+0

@ Zak: Я согласен, особенно если list_a, list_b длинные или уже массивы numpy. В противном случае вы платите, чтобы конвертировать их. – ntg