Как вернуть True, если в двумерном массиве в Python есть хотя бы один True - PullRequest
0 голосов
/ 05 мая 2019

Я пытаюсь написать код, который проверяет, имеет ли 2D-массив (состоит только из логических значений) хотя бы один True, и возвращает True, если хотя бы один True.

Я пытался использовать функцию all(), но не смог найти решение. Я предполагаю, что мне нужно противоположно тому, что делает функция all().

>>> array1 = [[True, False], [False, False]]
>>> all([all(row) for row in array1)
False # This should be True
>>> array2 = [[False, False], [False, False]]
>>> all([all(row) for row in array2)
False # This is correct but this and array with all True is only working case.

Для array1 = [[True, False], [False, False]] я ожидаю, что на выходе будет True, так как есть один True в array1[0][0].

Ответы [ 3 ]

2 голосов
/ 05 мая 2019
def has_true(arr):
    return any(any(row) for row in arr)

In [7]: array1 = [[True, False], [False, False]]

In [8]: array2 = [[False, False], [False, False]]

In [9]: has_true(array1)
Out[9]: True

In [10]: has_true(array2)
Out[10]: False

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

редактировать: удален ненужный код

0 голосов
/ 05 мая 2019

Гораздо более короткий подход - объединить списки вместе, используя itertools.chain и применить any к ним

from itertools import chain

def has_true(arr):
    return any(chain(*arr))

print(has_true([[True, False], [False, False]]))
print(has_true([[False, False], [False, False]]))

Выход будет

True
False
0 голосов
/ 05 мая 2019

используйте any () вместо all (). all () возвращает true, если все элементы в итерируемом объекте имеют значение true. any () Возвращает True, если любой элемент в итерируемом объекте равен true.

...