test etmek için bir dize listesi ile str.starts


183

Ben ifadeler ve karşılaştırmalar çok kullanmaktan kaçınmaya çalışıyorum ve sadece bir liste kullanın, ama nasıl kullanılacağından emin değilim 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"

Ne olmasını istiyorum:

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

Herhangi bir yardım mutluluk duyacağız.


7
Bu sorunun cevabı bana Python'u neden bu kadar çok sevdiğimi hatırlatıyor!
dotancohen

Herhangi bir nedenle birden fazla kontrol yapmanız gerekse bile, ˋlower () ˋ sonucunu kaydetmelisiniz. Bunu tekrar tekrar yapmanın bir anlamı yok.
Bachsau

Yanıtlar:


346

str.startswith aşağıdakileri test etmek için bir dizi ip sağlamanıza olanak tanır:

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

Gönderen docs :

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

Dönüş Trueile dizesinin başladığı takdirde prefix, aksi dönmek False.prefixayrıca aranacak bir dizi önek de olabilir.

Aşağıda bir gösteri:

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

3
Ve bunu desteklemiyorsa, yine de anyve bir genexp ile yapabilirsiniz.
user2357112 Monica

Karşı-olgusal koşullu, "belki eski bir versiyonda OP" değil.
user2357112 Monica

hey, ben im bir fonksiyonun bir parçası olarak kullanarak, nasıl eşleşen listeden öğeyi döndürmek için alabilirim?
roastbeeef

@roastbeeef ˋforˋ döngüsü. Başka seçenek yok. ;)
Bachsau

26

Şunları da kullanabilirsiniz any(), map()şöyle:

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

Veya alternatif olarak bir jeneratör ifadesi kullanarak :

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

6
Herhangi biriyle liste kavraması kullanmayın; bir jeneratör kullanın.
DylanYoung
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.