str.startswith mit einer Liste von Zeichenfolgen, auf die getestet werden soll

181

Ich versuche zu vermeiden, so viele if-Anweisungen und Vergleiche zu verwenden, und verwende einfach eine Liste, bin mir aber nicht sicher, wie ich sie verwenden soll 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"

Was ich möchte, ist:

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

Jede Hilfe wäre dankbar.

Ewigkeit
quelle
7
Die Antworten auf diese Frage erinnern mich daran, warum ich Python so sehr liebe!
Dotancohen
Auch wenn Sie aus irgendeinem Grund mehrere Überprüfungen durchführen müssen, sollten Sie das Ergebnis von ˋlower () ˋ speichern. Es macht keinen Sinn, das immer wieder zu tun.
Bachsau

Antworten:

343

str.startswith Mit dieser Option können Sie ein Tupel von Zeichenfolgen bereitstellen, auf die Sie testen möchten:

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

Aus den Dokumenten :

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

Rückgabe, Truewenn der String mit dem beginnt prefix, andernfalls return False. prefixkann auch ein Tupel von Präfixen sein, nach denen gesucht werden muss.

Unten ist eine Demonstration:

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

quelle
3
Und wenn es dies nicht unterstützt, könnten Sie es trotzdem mit anyund einem Genexp tun.
user2357112 unterstützt Monica
Kontrafaktische Bedingung, nicht "Vielleicht ist das OP auf einer alten Version".
user2357112 unterstützt Monica
Hey, wenn ich dies als Teil einer Funktion verwende, wie könnte ich es dazu bringen, das Element aus der Liste zurückzugeben, mit der es übereinstimmt?
Roastbeeef
@roastbeeef ˋforˋ Schleife. Keine anderen Optionen. ;)
Bachsau
25

Sie können auch verwendet werden any(), map()etwa so:

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

Oder alternativ mit einem Generatorausdruck :

if any(l.startswith(s) for s in x)
    pass # Do something
dafinguzman
quelle
6
Verwenden Sie kein Listenverständnis mit irgendwelchen; Verwenden Sie einen Generator.
DylanYoung