2013-10-06 10 views
9

Il mio codice è per un gioco Tic Tac Toe e il controllo per uno stato di disegnare ma penso che questa domanda potrebbe essere più utile in un senso generale.python utilizzando any() e all() per verificare se un elenco contiene un set di valori o un altro

Ho una lista che rappresenta il bordo, sembra che questo:

board = [1,2,3,4,5,6,7,8,9] 

Quando un giocatore fa una mossa INT si sono mossi sul viene sostituito con il proprio segnalino ('x' o 'O') , Ho già degli assegni per cercare uno stato vincente, quello che non posso fare è controllare uno stato di pareggio, dove nessuno dei valori di lista è stato inserito ma non è stato impostato uno stato vincente.

Il codice che ho finora:

if any(board) != playerOne or any(board) != playerTwo: 
    print 'continue' 
elif all(board) == playerOne or playerTwo: 
    print 'Draw' 

Il se lavori istruzione, l'Elif non, penso che il problema è il mio 'o' operatore, quello che voglio verificare è: se il ogni punto sul tabellone è o marcatore Playerone o pennarello playerTwo, se io dove per rendere il codice:

elif all(board) == playerOne or all(board) == playerTwo: 

sarei andato a vedere se ogni posto sul tabellone era Playerone o ogni luogo sul tabellone è playerTwo, quale non sarà.

Quindi, come posso controllare se la scacchiera è occupata da una combinazione di indicatori di giocatore singolo e giocatore di due indicatori?

+3

che non è proprio come [ 'qualsiasi()'] (http://docs.python.org/3/library/functions.html#any) e [ 'tutto()' ] (http://docs.python.org/3/library/functions.html#all) work: _ "Restituisce' True' se (any/all) l'elemento di iterable è true.Se il iterable è vuoto, return Falso. "_ –

risposta

20

all e any sono funzioni che accettano un iterabile e determinare uno:

  • nel caso di all(): se tutte i valori che sono iterable non False;
  • nel caso di any(): se qualsiasi dei valori in esso iterabili è diverso da False.

Quindi avete frainteso un po 'come funzionano queste funzioni.

Quindi, il seguente fa qualcosa di completamente non quello che si pensava che fa:

if any(foobars) == big_foobar: 

... perché any(foobars) sarebbe prima essere valutati a uno o TrueFalse, e quindi tale valore booleano sarebbe essere paragonato a big_foobar , che in pratica ti dà sempre False, supponendo che i foobar non siano booleani.

Nota: l'iterabile può essere un elenco, ma può anche essere un'espressione generatore/generatore (≈ lista lazily valutata/generata) o qualsiasi altro iteratore.

Ciò che si vuole invece è:

if any(x == big_foobar for x in foobars): 

che fondamentalmente prima costruisce un iterabile che produce una sequenza di booleani-per ogni elemento in foobars, confronta l'elemento da big_foobar ed emette il booleano risultante a la sequenza risultante:

tmp = (x == big_foobar for x in foobars) 

poi any dirige tutti gli elementi in tmp e restituisce True non appena trova il primo articolo True. E 'come se avete fatto la seguente:

foobars = ['big', 'small', 'medium', 'nice', 'ugly'] 
big_foobar = 'big' 
any(['big' == big_foobar, 'small' == big_foobar, 'medium' == big_foobar, ...]) 

Nota: Come DSM ha sottolineato, il caso any(x == y for x in xs) è meglio espressa come semplicemente y in xs -Questo è più facile da leggere, scrivere e molto più veloce.

Alcuni esempi:

any(x > 5 for x in range(4)) # => False 
all(isinstance(x, int) for x in range(10)) # => True 
any(x == 'Erik' for x in ['Erik', 'John', 'Jane', 'Jim']) # => True 
all([True, True, True, False, True]) # => False 

Vorrei suggerire semplicemente giocando con any e all con vari ingressi sul guscio di Python, o meglio ancora, sulla IPython shell per ottenere una sensazione di come funziona questo prima di continuare a scrivere il codice reale.

Consulta anche: http://docs.python.org/2/library/functions.html#all

+2

Penso invece di" qualsiasi (x == big_foobar per x nei foobar) "sarebbe più idiomatico scrivere" big_foobar in foobars ". – DSM

+0

Ok, quindi per cambiare linea: se qualcuno (scheda)! = PlayerOne o any (board)! = PlayerTwo: Diventerebbe: se presente (x! = PlayerOne o x! = PlayerTwo per x in board) :? – DasSnipez

+0

@DSM: sì, certo, ma ho dovuto basare i miei esempi sul suo caso d'uso :) –

Problemi correlati