2015-05-27 2 views
5

In Python, So che il modo divinatorio per verificare se una lista è vuota èPython: Come verificare se due liste non sono vuote

if not a: 
    # do things with empty list 

Per verificare se l'elenco non è vuoto, allora, faremmo :

if a: 
    # do things with my list 

come abbiamo fatto il check, contemporaneamente (come letto), se due liste, allora non sono vuoti?

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

È possibile che questo non sembra funzionare, e io sono sicuro che cosa significa in realtà (a and b). Per a = [2], b = [1,3], (a and b) = [1,3]. Che cosa fa effettivamente l'operatore and qui? Se finisco per ridurre b = [] ad un certo punto, (a and b) = [] anche se a non è vuoto.

Edit: Il mio caso d'uso più o meno così

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

avrei ingenuamente pensava che, poiché if a controlla se l'elenco non è vuoto, if a and b controllerei se né erano vuoti, che non è il caso.

+2

possibile duplicato di [Confusione trovata con e operatore] (http://stackoverflow.com/questions/24369368/confusion-found-with-and-operator) – vaultah

+0

cosa intendi quando dici "non funziona? "? – Wyrmwood

+0

Ho difficoltà a capire, 'se aeb:' sarà True solo se entrambi non sono vuoti –

risposta

6

Sta funzionando bene. Per a = [2] e b = [1, 3], a and b restituisce [1, 3] che è vero, esattamente come ci si aspetterebbe, perché True and True è True. Quando si modifica b in [], restituisce [], che è falsa, esattamente come ci si aspetterebbe, perché True and False è False. Quindi, if a and b fa esattamente quello che vuoi.

Che cosa sta realmente accadendo è che and restituisce il valore che ha determinato la verità dell'espressione.and non sempre valuta entrambe le sottoespressioni; quando il primo è falso, l'intera espressione è falsa e il secondo non ha bisogno di essere valutato, e quindi non lo è. Questo è chiamato cortocircuito. or si comporta in modo simile (ignorando la valutazione della seconda parte se la prima parte è veritiera). Laddove and o or è in grado di prendere una decisione, restituisce tale valore.

Un altro modo di guardarlo: bool(a) and bool(a) == bool(a and b) in Python.

+0

Grazie per aver spiegato questo, ha senso. C'è un modo migliore per controllare se i due non sono vuoti che controllandone le lunghezze? – drglove

+2

Sì. 'se aeb 'come l'hai avuto in origine. – kindall

+0

Vedo la mia confusione, grazie! – drglove

0

si può fare questo

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

Funziona ma è unidiomatico. –

+0

Ci ho pensato, ma mi chiedo se ci sia qualcosa di più vicino a "aeb". In caso contrario, mi accontento di ciò, ma mi piacerebbe ancora sapere cosa sta facendo l'operatore qui. – drglove

+0

Puoi dare un esempio in cui questo avrebbe un comportamento diverso da 'if aeb:'? – Kevin

2

a and b è corretto.

and restituisce il secondo argomento se il primo è vero.

+0

il secondo commento, mentre true è solo significativo al di fuori di un if (come un compito) – Wyrmwood

-1

penso che quello che vuoi è

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

and operatore è confrontare due valori booleani

bool([]) == False 

così [] and b ritornano sempre []; non importa cosa sia b.