Существуют ли встроенные функции для поэлементных логических операторов над логическими списками? - PullRequest
27 голосов
/ 05 мая 2010

Например, если у вас есть n списков логических значений одинаковой длины, тогда элементарное логическое И должно возвращать другой список этой длины, имеющий значение True в тех позициях, где все входные списки имеют значение True, и False везде, где-либо еще.

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

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

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]

Ответы [ 5 ]

21 голосов
/ 05 мая 2010

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

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

19 голосов
/ 11 июня 2014

Попробуйте:

[ x&y for (x,y) in zip(list_a, list_b)]
2 голосов
/ 04 июня 2014

Функция 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)
1 голос
/ 05 мая 2010

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

1 голос
/ 05 мая 2010

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

...