2013-11-01 15 views
52

mi ritrovo più volte a scrivere lo stesso pezzo di codice:Il modo più semplice per verificare se una stringa contiene una stringa nell'elenco?

def stringInList(str, list): 
    retVal = False 
    for item in list: 
     if str in item: 
      retVal = True 
    return retVal 

C'è un modo posso scrivere questa funzione più veloce/con meno codice? Io di solito uso questo in un'istruzione if, come questo:

if stringInList(str, list): 
    print 'string was found!' 
+8

+1 per non dire semplicemente "C'è un modo semplice per ..." e in realtà mostrare ciò che hai. Ben fatto – TerryA

+5

Non hai bisogno di una variabile locale 'retVal' in quella funzione, solo' return True' quando lo trovi, altrimenti 'False'. Salta alcuni loop inutili. (e sì, basta usare "any') – roippi

+1

Solo curioso, perché continui a averne bisogno ancora e ancora? Non riesco a pensare a un caso d'uso. –

risposta

77

Sì, utilizzare any():

if any(s in item for item in L): 
    print 'string was found!' 

Come la documentazione parlare, questo è più o meno equivalente alla funzione, ma any() posso prendere espressioni di generatore anziché solo una stringa e un elenco e any() cortocircuiti. Una volta che s in item è True, la funzione si interrompe (puoi semplicemente farlo con la tua funzione se cambi semplicemente retVal = True in return True. Ricorda che le funzioni si interrompono quando restituisce un valore).


Si dovrebbe evitare di nominare stringhe str e liste list. Ciò sostituirà i tipi predefiniti.

+0

Bella risposta, sì. – aIKid

+1

+1 Per la risposta semplice e semplice ma ancora molto utile. – Houssni

+3

'any' ha il vantaggio di efficienza equivalente a quello indicato nel commento di @ roippi: restituisce solo' true' sulla prima istanza di un elemento true, e 'false' se arriva alla fine senza incontrare un vero elemento (check out il codice equivalente http://docs.python.org/2/library/functions.html#any) – Silverfish

Problemi correlati