Python: как проверить, не пусты ли два списка

в Python я знаю питонический способ проверить, пуст ли список, это

if not a:
    # do things with empty list

чтобы проверить, не пуст ли список, мы бы сделали:

if a:
    # do things with my list

как бы мы проверили, одновременно (как читается), если два списка тогда не пусты?

if a and b:
    # do things with my two lists

выше, похоже, не работает, и я не уверен, что (a and b) на самом деле означает. Для a = [2], b = [1,3], (a and b) = [1,3]. Что такое and оператор на самом деле здесь делаешь? Если я в конечном итоге сокращение b = [] в какой-то точка, (a and b) = [] хотя a не пуст.

Edit: мой прецедент идет что-то вроде

while (a and b are not empty):
    modify a
    modify b

я бы наивно думала, что с if a проверяет, не пуст ли список,if a and b проверил бы, не были ли они пустыми, что не так.

5 ответов


он работает нормально. Для a = [2] и b = [1, 3], a and b возвращается [1, 3] что правдиво, как и следовало ожидать, потому что True and True is True. При изменении b to [] возвращает [], что является ложным, опять же, как и следовало ожидать, потому что True and False is False. Так что if a and b делает именно то, что вы хотите.

что на самом деле происходит вот что:and возвращается значение, которое определило истинность выражения. and не всегда оценивает оба под-выражения; когда первое является ложным, все выражение является ложным, а второе не нуждается в оценке и, следовательно, не является. Это называется короткое замыкание. or ведет себя аналогично (пропуская оценку второй части, если первая часть правдива). Где and или or способен принять решение, он возвращает это значение.

другой способ взглянуть на это:bool(a) and bool(a) == bool(a and b) в Python.


a and b является правильным.

and возвращает второй аргумент, если первый равен true.


вы можете сделать это

if len(a) and len(b):
    #do something

and оператор сравнивает два логических значения

    bool([]) == False

так [] and b всегда возвращает []; несмотря ни на что b есть.


Я думаю, что вы хотите

>>> a, b = list(), list()
>>> while not (a and b):
...    a.append(1)
...    b.append(2)
...
>>> a, b
([1], [2])
>>>