inicia com uma lista de cadeias para testar


183

Estou tentando evitar o uso de tantas declarações e comparações if e simplesmente usando uma lista, mas não sei como usá-lo com str.startswith:

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"

O que eu gostaria que fosse é:

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

Qualquer ajuda seria apreciada.


7
As respostas a esta pergunta me lembram porque eu amo tanto o Python!
dotancohen

Mesmo se você precisar fazer várias verificações por algum motivo, salve o resultado de ˋlower () ˋ. Não faz sentido fazer isso de novo e de novo.
Bachsau

Respostas:


346

str.startswith permite fornecer uma tupla de cadeias de caracteres para testar:

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

Dos documentos :

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

Retorne Truese a sequência começar com prefix, caso contrário, retorne False. prefixtambém pode ser uma tupla de prefixos para procurar.

Abaixo está uma demonstração:

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

3
E se não anysuportasse isso, você poderia fazê-lo de qualquer maneira com e um genexp.
User2357112 suporta Monica

Condicional contrafactual, não "talvez o OP esteja em uma versão antiga".
User2357112 suporta Monica

Ei, se eu estiver usando isso como parte de uma função, como eu poderia fazer com que ele retornasse o item da lista correspondente?
Roastbeeef

@roastbeeef ˋforˋ loop. Não há outras opções. ;)
Bachsau

26

Você também pode usar any(), map()assim:

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

Ou, alternativamente, usando uma expressão geradora :

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

6
Não use uma compreensão de lista com nenhum; use um gerador.
DylanYoung
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.