HOWTO · Python

Überprüfen Sie, ob ein String in Python ein Palindrom ist

Prüfen Sie, ob ein Python-String ein Palindrom ist – mit Slicing, reversed(), Schleifen, Rekursion oder deque. Außerdem erfahren Sie, wie Sie den Text für einen Vergleich ohne Beachtung von Groß- und Kleinschreibung, Leerzeichen und Satzzeichen normalisieren.

Auf dieser Seite

Ein Palindrom liest sich vorwärts und rückwärts gleich, zum Beispiel level. Bei der einfachen Prüfung wird jedes Zeichen genau so verglichen, wie es eingegeben wurde. Soll die Prüfung Groß- und Kleinschreibung, Leerzeichen oder Satzzeichen ignorieren, normalisieren Sie den Text zuerst.

Prüfen, ob ein Python-String mit Slicing ein Palindrom ist

Beim Slicing von Strings wird eine umgekehrte Kopie erstellt. Der Slice [::-1] durchläuft einen String vom letzten bis zum ersten Zeichen. Ein Vergleich mit dem Original ist daher eine kompakte Prüfung der unveränderten Zeichenfolge. Ersetzen Sie level durch den Wert, den Sie prüfen möchten.

word = "level"
print("Palindrome" if word == word[::-1] else "Not Palindrome")

Slicing funktioniert direkt mit Strings und ist keine Listenmethode. Bei diesem Vergleich wird zwischen Groß- und Kleinschreibung unterschieden; Leerzeichen und Satzzeichen gelten als gewöhnliche Zeichen. Die Prüfung benötigt lineare Zeit und erstellt einen umgekehrten String.

Prüfen, ob ein Python-String mit reversed() ein Palindrom ist

Die integrierte Funktion reversed() gibt einen Iterator über die Zeichen in umgekehrter Reihenfolge zurück. Mit join() wandeln Sie diesen Iterator in einen String um, den Sie anschließend mit dem Original vergleichen können.

word = "level"
reverse = "".join(reversed(word))
print(word == reverse)

reversed() gibt selbst keinen String zurück. Beim Zusammenfügen und Vergleichen werden die Zeichen durchlaufen, daher benötigt dieser Ansatz lineare Zeit. Anders als beim Slicing wird dabei nicht zuerst mithilfe eines Slices eine umgekehrte Kopie erstellt.

Prüfen, ob ein Python-String mit einer Schleife ein Palindrom ist

Eine Schleife kann jedes Zeichen mit dem Zeichen am gegenüberliegenden Ende vergleichen. Der rechte Index lautet len(word) - index - 1. Wenn Sie nur die erste Hälfte der Positionen prüfen, erfassen Sie damit jedes Zeichenpaar.

word = "radar"
result = True
for index in range(len(word) // 2):
    if word[index] != word[len(word) - index - 1]:
        result = False
        break
print(result)

Sobald ein Zeichenpaar nicht übereinstimmt, wird die Schleife beendet. Der Aufwand wächst linear mit der Länge des Strings; eine umgekehrte Kopie wird nicht erstellt.

Prüfen, ob ein Python-String mit Rekursion ein Palindrom ist

Bei der Rekursion werden zunächst die äußeren Zeichen verglichen. Anschließend ruft sich dieselbe Funktion mit dem Teilstring zwischen diesen Zeichen erneut auf. Ein String mit weniger als zwei Zeichen ist der Basisfall: Es gibt keine unterschiedlichen äußeren Zeichen, die gefunden werden könnten.

def is_palindrome(text):
    if len(text) < 2:
        return True
    return text[0] == text[-1] and is_palindrome(text[1:-1])

print(is_palindrome("level"))

Diese Variante eignet sich, um zu lernen, wie sich ein Problem in kleinere Prüfungen zerlegen lässt. Jeder Aufruf erstellt durch Slicing einen Teilstring, was zusätzliche Kopierarbeit verursacht. Bei langen Eingaben kann das Rekursionslimit von Python überschritten werden. Verwenden Sie für gewöhnlichen Anwendungscode daher besser Slicing oder eine Schleife.

Prüfen, ob ein Python-String mit einer deque ein Palindrom ist

Eine collections.deque ist eine doppelseitige Warteschlange. Damit kann die Prüfung jeweils ein Zeichen von beiden Enden entfernen und das Paar vergleichen. Das Erstellen der deque und das Prüfen aller Zeichenpaare benötigen insgesamt lineare Zeit.

from collections import deque

def is_palindrome(text):
    chars = deque(text)
    while len(chars) > 1:
        if chars.popleft() != chars.pop():
            return False
    return True

print(is_palindrome("radar"))

Das Entfernen einzelner Elemente an den Enden dauert jeweils konstante Zeit. Die vollständige Prüfung ist jedoch nicht konstant: Sie kann jedes Zeichen verarbeiten. Verglichen werden die ursprünglichen Zeichen einschließlich Groß- und Kleinschreibung, Leerzeichen und Satzzeichen.

Groß- und Kleinschreibung sowie nicht alphanumerische Zeichen bei der Palindromprüfung ignorieren

Für Prüfungen ganzer Sätze wandeln Sie den Text zunächst in Kleinbuchstaben um und behalten nur alphanumerische Zeichen. Dadurch ändert sich, was als Palindrom gilt: Groß- und Kleinschreibung, Leerzeichen und Satzzeichen beeinflussen den Vergleich nicht mehr; Buchstaben und Ziffern bleiben relevant.

def is_palindrome(text):
    normalized = "".join(char.lower() for char in text if char.isalnum())
    return normalized == normalized[::-1]

phrase = "A man, a plan, a canal, Panama!"
print(is_palindrome(phrase))

isalnum() behält Buchstaben und Ziffern bei. Pythons String-Methoden unterstützen Unicode-Zeichen. Wenn eine Anwendung nur ein bestimmtes Alphabet akzeptieren soll, legen Sie diese Zeichenregel stattdessen ausdrücklich fest.

Einen Ansatz zur Palindromprüfung in Python auswählen

Für die kürzeste Prüfung der unveränderten Zeichenfolge verwenden Sie word == word[::-1]. reversed() zusammen mit join() ist eine passende Alternative, wenn ein Iterator nützlich ist. Eine Schleife eignet sich, wenn explizite Vergleiche der Zeichenpaare und ein vorzeitiger Abbruch die Logik verständlicher machen. Auch mit einer deque lassen sich die Zeichen an beiden Enden vergleichen. Rekursion dient vor allem zu Lernzwecken, da jeder Aufruf Text ausschneidet und lange Eingaben das Rekursionslimit erreichen können.

Entscheiden Sie, ob Sie die Eingabe unverändert vergleichen oder zuerst normalisieren möchten. Davon hängt ab, wie Groß- und Kleinschreibung, Leerzeichen und Satzzeichen das Ergebnis beeinflussen. Weitere Techniken zur Textverarbeitung finden Sie unter Python reguläre Ausdrücke (Regex).