Python любая () функция во вложенном списке, возвращающая неверное значение - PullRequest
0 голосов
/ 30 января 2020

Здравствуйте. Я пытаюсь использовать функцию any () в python. После прочтения документации функция должна возвращать True каждый раз, когда в списке есть True. Однако в моем вложенном списке ниже функция возвращает true, хотя в списке нет значений True.

b = [[False, False], [False, False]]
print(any(b))

печатает True

Я пытаюсь вернуть False, если все значения в списке имеют значение False и True, если любое значение равно True, поэтому отрицание не будет работать. Как я могу это исправить? Спасибо за помощь.

Ответы [ 4 ]

2 голосов
/ 30 января 2020

Как насчет

any(any(x) for x in b)

, при этом каждый список в списке проверяется на True, а затем проверяется, был ли какой-либо из этих результатов True

1 голос
/ 30 января 2020

При условии, что вы имеете дело только с одним уровнем вложенности, вы можете просто map any() на элементы списка и взять any() из этого:

b = [[False, False], [False, False]]
any(map(any, b))
# False

c = [[False, False], [False, True]]
any(map(any,c))
# True

Конечно, если ваши элементы может быть вложен произвольно, вам нужно еще пару строк кода.

b = [[False, False], False, [False, [False, True]]]
c = [[False, False], False, [False, [False, False]]]

def any_nested(item):
     if not isinstance(item, list):
        return bool(item)
     return any(map(any_nested, item))

any_nested(b)
# True
any_nested(c)
# False
1 голос
/ 30 января 2020

Вы можете использовать chain.from_iterable из itertools , чтобы сгладить вложенный список. Если вы передадите это any, вы получите желаемый результат. Это будет работать для любого уровня вложенности, а не только для двух.

>>> from itertools import chain
>>> b = [[False, False], [False, False]]
>>> any(chain.from_iterable(b))
False
>>> c = [[False, False], [False, True]]
>>> any(chain.from_iterable(c))
True
0 голосов
/ 30 января 2020

Функция any () возвращает true, если любой из элементов в переданном списке имеет значение true

В вашем случае у вас есть два вложенных списка, и вы вызываете any() в первичном списке. Технически, ваш основной список - True, так как он содержит два списка, которые имеют элементы.

# Empty list returns False as no elements exist   
bool([])
False
# List with one element returns True
bool([0])
True
# Even with the list containing False, the list is `True` because it contains an element.
bool([False])
True

any() принимает итерацию и проверяет, есть ли какое-либо значение в пределах этой итерации, равно True или False.

Вы передаете два списка с элементом в каждом, что приводит к возвращению True, с вашим кодом вы фактически никогда не проверяете, являются ли значения в ваших вложенных списках True или False

bool([False, False])
True

Если вы перебираете содержимое вложенных списков, вы получите возврат False

for item in b:
    any(item)


False
False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...