2010-08-30 15 views
8

devo controllare un sacco di mondi, se sono nella stringa ... codice è simile:Come renderlo più corto (Pythonico)?

if "string_1" in var_string or "string_2" in var_string or "string_3" in var_string or "string_n" in var_string: 
    do_something() 

come renderlo più leggibile e più chiaro?

+0

espressione regolare, (ma non ricordo come farlo in python) – pastjean

risposta

35

Questo è un modo:

words = ['string_1', 'string_2', ...] 

if any(word in var_string for word in words): 
    do_something() 

Riferimento: any()

Aggiornamento:

Per completezza, se si vuole eseguire la funzione solo se tutto parole sono contenute in la stringa, è possibile utilizzare all() anziché any().

Si noti inoltre che questo costrutto non farà alcun calcoli inutili come any tornerà se incontra un valore true e generator expression viene utilizzato per creare i valori booleani. Quindi hai anche una specie di short-circuit evaluation che viene normalmente usata per valutare le espressioni booleane.

+0

Grazie è quello che mi serviva ... – Pol

+0

@Pol: dovresti contrassegnarlo come accettato, quindi. –

1

Hai guardato il filtro?

filter(lambda x: x in var_string, ["myString", "nextString"]) 

che poi possono essere combinati con la mappa per arrivare a questo

map(doSomething(), filter(lambda x: x in var_string, ["myString", "nextString"])) 

EDIT:

, naturalmente, che non fa quello che si vuole. Vai con la soluzione any. Per qualche ragione ho pensato che volevi farlo ogni volta invece che una sola volta.

+0

Non eseguirà 'doSomething()' per qualsiasi parola presente nella stringa? –

+0

Sì. Oh aspetta, voleva solo che fosse fatto una volta, no? Una schifezza. Grazie per la segnalazione. – wheaties

0
>>> import re 
>>> string="word1testword2andword3last" 
>>> c=re.compile("word1|word2|word3") 
>>> c.search(string) 
<_sre.SRE_Match object at 0xb7715d40> 
>>> string="blahblah" 
>>> c.search(string) 
>>> 
+0

questo sembra meno conciso e meno pitonico ai miei occhi di pitone – marr75

+5

Definisci Pythonic? Cosa rende Pythonic qualcosa? L'unica affermazione concisa sopra è re.compile e re.search. Il resto mostra solo esempi di output. Oh aspetta, il prompt dell'interprete Python potrebbe offuscare i tuoi occhi Pythonic ... – ghostdog74

2
import re 
if re.search("string_1|string_2|string_n", var_strings): print True 

La bellezza di pitone regex esso che restituisce un oggetto regex (che dà informazioni su ciò che abbinati) o Nessuno, che può essere utilizzato come un valore "false" in un test.

2

Con regex che sarebbe:

import re 
words = ['string_1', 'string_2', ...] 

if re.search('|'.join([re.escape(w) for w in words]), var_string): 
    blahblah 
+0

Ho quasi svalutato perché è inventivo e Felix Kling ha già avuto così tanti upvotes;) Ma fallisce se una delle stringhe contiene metacaratteri regex. – delnan

+0

Ed ecco perché c'è il re.escape .... – ondra

0

un altro modo per raggiungere questo check = lambda a: any(y for y in ['string_%s'%x for x in xrange(0,10)] if y in a)

print check('hello string_1')

Problemi correlati