2013-05-24 11 views
5

Sto facendo un compito a proposito di un gioco cuore con versione diversa. Dice che se ci viene assegnata una lista mycards che contiene tutte le carte che il giocatore attualmente detiene nelle loro mani. E gioca è una singola carta che rappresenta una potenziale carta. E se tutte le le loro carte contengono CUORE (H) o QUEEN OF SPADES (QS) restituirà True.Come controllare tutti gli elementi in un elenco che ha un requisito specifico?

Per esempio

>>> mycards= ['0H','8H','7H','6H','AH','QS'] 
>>> play = ['QS'] 

Si restituirà true

questo è quello che ho cercato

if play[1] == 'H': 
    return True 
if play == 'QS': 
    return True 
else: 
    return False 

Ma penso che i miei codici basta controllare un QS e una H nel elenco. Come rendere i codici che contengono all QS o H?

risposta

10

tua descrizione mappa direttamente alla soluzione:

cura per chiarezza:

mycards= ['0H','8H','7H','6H','AH','QS'] 
all((x == 'QS' or 'H' in x) for x in mycards) 
# True 
+1

Eh? Perché il downvote qui? –

+0

Oh, vero, ho bisogno di un caffè +1 – jamylak

+0

Grazie mille –

5
>>> mycards= ['0H','8H','7H','6H','AH','QS'] 
>>> all(x[-1] == 'H' or x == 'QS' for x in mycards) 
True 
+0

Non so come questo sia diverso da quello che Thomas ha pubblicato. –

+0

Non penso che 'x [-1] == 'H'' sia necessario - per quanto ne so (e il caffè sta arrivando), solo un seme in un mazzo di carte inizia con' H'. –

+0

+1, perché la domanda originale contiene l'equivalente 'x [1]'. Questo è anche più veloce di "H" in x'. – EOL

2

Dalla sua il tuo 'compiti a casa' Non ho intenzione di fornire con il codice ready-made. :)

iterare l'elenco utilizzando un ciclo:

per esempio .:

for el in mycards: 

ad ogni iterazione si deve controllare uno qualsiasi dei due condizioni sono vere o no.

if el == 'QS' or el[1] == 'H': 

se la carta è regina di Spade o una condizione di cuore sopra sarà vera. Spero che tu lo capisca fino ad ora. E se la condizione non è vera, restituisci semplicemente False.

Se tutti gli elementi delle liste sono controllati dal ciclo e ancora non è stato restituito False, quindi tutte le carte sono o Regina di Spade o Cuore. Quindi torna True dopo che il ciclo termina.

Prova da soli per un po ', se ancora non ottenere farò pubblicare il codice a richiesta (ma dovrete mostrarmi ciò che si è tentato: p)

Edit: Dal momento che' ho provato, sto anche postando il codice.

def HorQS(mycards): 
    for i in mycards: 
     if i != 'QS': 
      if i[1] != 'H': 
       return False 
    return True 

print HorQS(['0H','8H','7H','6H','AH','QS']) # True 
print HorQS(['0H','8H','7H','6H','AH','HS']) # False 
print HorQS(['0H','8H','7K','6H','AH','HS']) # False 
+0

Python ha 'all()' in modo che le persone non debbano reinventare la ruota come qui, e in modo che il significato del loro codice sia molto più ovvio. Non incoraggerei nessuno a utilizzare una soluzione così complicata (che è necessaria solo in un linguaggio come C). – EOL

+0

Stavo mirando più a spiegare asker come dovrebbe funzionare il suo codice. Pensare e inquadrare l'algoritmo nella mente di Asker era il mio motivo principale. E poiché è stata una domanda molto facile, eppure ha chiesto chiaramente di suggerire la debolezza di Asker nel convertire i suoi requisiti in codici. Sono d'accordo con tutti(), ma dovrebbe essere la versione successiva della spiegazione, altrimenti gli studenti semplicemente crederanno che "Oh sì, questa funzione fa il mio lavoro, a chi importa cosa sta succedendo dentro". Non voglio che i neofiti pensino in quel modo. –

+0

@RaviOjha grazie per la spiegazione :) mi aiuta molto! –

Problemi correlati