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.