테스트 할 문자열 목록으로 str.starts


183

너무 많은 if 문과 비교를 사용하지 않고 단순히 목록을 사용하려고하지만 목록과 함께 사용하는 방법을 잘 모르겠습니다 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"

내가 원하는 것은 다음과 같습니다.

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

도움을 주시면 감사하겠습니다.


7
이 질문에 대한 답변은 왜 내가 파이썬을 그렇게 좋아하는지 상기시켜줍니다!
dotancohen

어떤 이유로 여러 번 검사해야 할 경우에도 ˋlower () ˋ의 결과를 저장해야합니다. 반복해서 그렇게 할 필요가 없습니다.
Bachsau

답변:


346

str.startswith 테스트 할 문자열 튜플을 제공 할 수 있습니다.

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

로부터 문서 :

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

반환 True와 캐릭터가 시작될 경우 prefix, 그렇지 않으면 반환 False. prefix찾을 접두사의 튜플 일 수도 있습니다.

아래는 데모입니다.

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

3
그리고 이것을 지원하지 않으면 어쨌든 anygenexp로 할 수 있습니다.
user2357112는

"OP가 이전 버전 일 수 있습니다."가 아닌 실제 조건입니다.
user2357112는 Monica

이 기능을 함수의 일부로 사용하는 경우 일치하는 목록에서 항목을 반환하려면 어떻게해야합니까?
roastbeeef

@roastbeeef ˋforˋ 루프. 다른 옵션은 없습니다. ;)
Bachsau

26

당신은 또한 사용할 수 있습니다 any(), map()과 같이 :

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

또는 발전기 표현식을 사용하여 :

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

6
목록 이해력을 사용하지 마십시오. 발전기를 사용하십시오.
DylanYoung
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.