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.


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
>>>

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

6
Verwenden Sie kein Listenverständnis mit irgendwelchen; Verwenden Sie einen Generator.
— DylanYoung
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.