2013-12-09 4 views
78

sto cercando di evitare l'uso di tanti se le dichiarazioni e le comparazioni e semplicemente utilizzare un elenco, ma non è sicuro come usarlo con str.startswith:str.startswith con una lista di stringhe di prova per

if link.lower().startswith("js/") or link.lower().startswith("catalog/") or link.lower().startswith("script/") or link.lower().startswith("scripts/") or link.lower().startswith("katalog/"): 
    # then "do something" 

Quello che vorrei che fosse:

if link.lower().startswith() in ["js","catalog","script","scripts","katalog"]: 
    # then "do something" 

Qualsiasi aiuto sarebbe apprezzato.

+2

Le risposte a questa domanda mi ricorda perché amo così tanto Python! – dotancohen

risposta

154

str.startswith consente di fornire una tupla di stringhe per verificare:

if link.lower().startswith(("js", "catalog", "script", "katalog")): 

Dal docs:

str.startswith(prefix[, start[, end]])

ritorno True se la stringa inizia con la prefix, altrimenti ritorno False. prefix può anche essere una tupla di prefissi da cercare.

Qui di seguito è una dimostrazione:

>>> "abcde".startswith(("xyz", "abc")) 
True 
>>> prefixes = ["xyz", "abc"] 
>>> "abcde".startswith(tuple(prefixes)) # You must use a tuple though 
True 
>>> 
+2

E se non lo supporta, potresti farlo comunque con 'any' e un genexp. – user2357112

+0

Controfattuale condizionale, non "forse l'OP è su una vecchia versione". – user2357112

11

È inoltre possibile utilizzare any(), map() in questo modo:

if any(map(l.startswith, x)): 
    pass # Do something 

Oppure, in alternativa, utilizzando list comprehension:

if any([l.startswith(s) for s in x]) 
    pass # Do something