Python / len() / Die Länge eines Strings ermitteln
Pythons len(text) liefert die Anzahl der Unicode-Codepunkte eines Strings, einschließlich Leerzeichen und Zeilenumbrüchen. Sie entspricht nicht immer der Bytezahl oder der am Bildschirm wahrgenommenen Zeichenzahl. Bei Sammlungen mit Längenunterstützung wie Listen, Tupeln und Dictionaries liefert sie die Anzahl der Elemente.
Grundlagen, Leerzeichen und Zeilenumbrüche
len() erwartet ein Objekt, das Länge unterstützt. Der leere String hat Länge null; umschließende Anführungszeichen zählen nicht. Unicode-Codepunkte identifizieren Textelemente und bilden die Einheiten von Pythons str-Typ.
Verwenden Sie Python 3. Speichern Sie jedes vollständige Beispiel als length_example.py in UTF-8 und führen Sie python length_example.py beziehungsweise python3 aus. Ersetzen Sie den Inhalt, um Beispiele unabhängig auszuführen.
for text in ("abc", "", "a b", "a\nb"):
print(repr(text), len(text))
Erwartete Ausgabe:
'abc' 3
'' 0
'a b' 3
'a\nb' 3
"a b" enthält ein Leerzeichen, "a\nb" einen Zeilenumbruch; beide sind drei Einheiten lang. Die Quellschreibweise \n verwendet zwei Zeichen, steht im Stringwert jedoch für einen Zeilenumbruch. repr() macht den Unterschied sichtbar.
Stringlänge gegenüber UTF-8-Bytes
UTF-8-Kodierung erzeugt bytes zur Speicherung oder Übertragung. len(text) zählt Codepunkte, len(text.encode("utf-8")) kodierte Bytes. \u00e9 bezeichnet hier das akzentuierte Zeichen é.
text = "caf\u00e9"
data = text.encode("utf-8")
print(len(text))
print(len(data))
4
5
Der String hat vier Codepunkte, aber fünf UTF-8-Bytes, weil das letzte Zeichen zwei Bytes benötigt. Bei bytebasierten Datei- oder Protokollgrenzen messen Sie mit der vorgeschriebenen Kodierung. Die Stringlänge ist auch kein direktes Maß des Speicherverbrauchs.
Kombinierende Zeichen und Emoji
é lässt sich als ein Codepunkt oder als e mit einem kombinierenden Akzent, insgesamt zwei Codepunkten, darstellen. Ähnliches Aussehen garantiert weder gleiche Werte noch gleiche Länge. Unicode-Graphemcluster gruppieren Codepunkte zu Einheiten, die wahrgenommenen Zeichen näherkommen.
import unicodedata
composed = "\u00e9"
decomposed = "e\u0301"
emoji = "\U0001f469\u200d\U0001f4bb"
print(len(composed), len(decomposed))
print(composed == decomposed)
print(len(unicodedata.normalize("NFC", decomposed)))
print(len(emoji))
1 2
False
1
3
Unicode-Normalisierung mit unicodedata.normalize("NFC", text) setzt kanonisch kombinierbare Darstellungen zusammen. Hier wird aus Länge zwei die Länge eins. Das wandelt nicht jedes Emoji oder jede Kombination in einen Codepunkt um: Die Emoji-Sequenz der Technikerin im Beispiel enthält drei.
Definieren Sie vor einer „Zeichenbegrenzung“, ob Codepunkte, Graphemcluster oder Bytes gemeint sind. NFC ersetzt keine Graphemzählung. Verwenden Sie eine Implementierung der passenden Unicode-Segmentierungsregeln und prüfen Sie typische Eingaben.
Sammlungsgrößen und ungeeignete Werte
Listen, Tupel, Dictionaries und Mengen unterstützen ebenfalls Länge. Dictionaries zählen Schlüssel, Mengen unterschiedliche Elemente. Eine verschachtelte Liste zählt äußere Elemente und summiert innere Werte nicht automatisch.
print(len([10, 20, 30]))
print(len((10, 20)))
print(len({"a": 10, "b": 20}))
print(len({1, 1, 2}))
rows = [[1, 2], [3, 4]]
print(len(rows))
print(sum(len(row) for row in rows))
3
2
2
2
2
4
Zahlen und None definieren keine Länge und lösen TypeError aus. Für die Länge einer Zahlendarstellung können Sie einen String verwenden, der auch Minuszeichen und Dezimalpunkt mitzählt. Iterierbarkeit bedeutet nicht automatisch Unterstützung für len(); gewöhnliche Generatoren haben keine Länge.
for value in (1234, None):
try:
print(len(value))
except TypeError:
print("TypeError")
print(len(str(1234)))
items = (n * 2 for n in range(3))
try:
print(len(items))
except TypeError:
print("TypeError")
values = list(items)
print(len(values))
print(list(items))
TypeError
TypeError
4
TypeError
3
[]
Die Umwandlung eines Generators in eine Liste ermöglicht das Zählen, verbraucht jedoch seine Elemente und speichert sie im Arbeitsspeicher. Deshalb ist das zweite list(items) leer. Materialisieren Sie sehr große Daten oder unendliche Iteratoren nicht allein für eine Längenprüfung.
Vollständige Prüfung einer Eingabelänge
Diese Funktion akzeptiert Strings und prüft nach dem Entfernen äußeren Leerraums auf 1–12 Codepunkte. Leere und reine Leerraumeingaben werden abgelehnt; der ursprüngliche String bleibt unverändert.
def valid_name(text):
if not isinstance(text, str):
raise TypeError("name must be a string")
name = text.strip()
return 1 <= len(name) <= 12
for text in ("Ada", " ", "a" * 13, " Ada "):
print(repr(text), valid_name(text))
'Ada' True
' ' False
'aaaaaaaaaaaaa' False
' Ada ' True
Sie prüft weder Inhalt noch Zeichenklassen, entfernt nicht sämtlichen inneren Leerraum und begrenzt keine visuelle Zeichenzahl. Stimmen Sie Längeneinheit, Leerraumregeln, erlaubte Zeichen und serverseitige Prüfung ab, damit Oberfläche und Speicherung dieselbe Eingabe konsistent beurteilen.




