2015-05-27 4 views
5

В 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 бы проверить, если ни были пусты, что это не так.

+2

Возможный дубликат [Confusion found with and operator] (http://stackoverflow.com/questions/24369368/confusion-found-with-and-operator) – vaultah

+0

Что вы имеете в виду, когда говорите «не ..» «? – Wyrmwood

+0

У меня возникли проблемы с пониманием ', если a и b:' будут только Истинными, если оба не будут пустыми –

ответ

6

Работает нормально. Для a = [2] и b = [1, 3], a and b возвращается [1, 3], который правдивый, точно так, как вы ожидали бы, потому что True and True - True. Когда вы меняете b на [], он возвращает [], что является ложным, снова точно так же, как и следовало ожидать, потому что True and False - False. Итак, if a and b делает именно то, что вы хотите.

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

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

+0

Спасибо за объяснение этого, имеет смысл. Есть ли лучший способ проверить, не являются ли эти два пустым, чем путем проверки их длины? – drglove

+2

Да. 'if a и b', как вы изначально имели его. – kindall

+0

Я вижу свое замешательство, спасибо! – drglove

0

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

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

Это работает, но является унииоматическим. –

+0

Я подумал об этом, но мне интересно, есть ли что-то ближе к «a и b». Если нет, я соглашусь на это, но мне все равно хотелось бы знать, что на самом деле делает оператор. – drglove

+0

Можете ли вы привести пример, где это будет иметь другое поведение от 'if a и b:'? – Kevin

2

a and b правильно.

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

+0

второй комментарий, в то время как истина имеет смысл только вне if (как присвоение) – Wyrmwood

-1

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

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

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

bool([]) == False 

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

Смежные вопросы