2016-06-26 10 views
3

Wenn ich mich nicht irre, wird eine Python-Zeichenfolge in Unicode-Skalaren gespeichert. Unicode-Skalare können jedoch zu anderen Graphem-Clustern kombiniert werden. Daher ist die Verwendung der Speicherverlagerung start + scalarSize * n für string[n] nicht die Antwort, die Sie suchen.Zeit Komplexität von Python-String-Index-Zugriff?

Bedeutet dies, dass Python linear durch jeden Skalar iteriert, um zu dem Skalar zu gelangen, nach dem Sie suchen? Wenn Sie

word = 'caf' + char(65) + char(301) #café 

Does Python speichern diese als fünf Skalare und iterativ überprüfen, ob einer, bevor kombiniert werden soll oder hat sie einen Scheck beim Einsetzen und Laden ‚reinen‘ Skalare läuft?

Edit: Ich habe Python mit einer anderen Sprache verwechselt. Pythons print() druckt Graphem-Cluster aus, aber Pythons str speichert Skalare, egal wie Sie sie eingeben. Also werden zwei kombinierte Skalare als ein Graphem-Cluster gedruckt, der derselbe Cluster wie ein anderer Skalar sein kann. Wenn Sie string[0] aufrufen, erhalten Sie den Skalar als eingefügt in die Zeichenfolge.

Antwort

2

Bei der Python-String-Indizierung werden Graphem-Cluster nicht berücksichtigt. Es funktioniert mit Unicode-Codepunkten. Ich glaube nicht, dass Python tatsächlich etwas eingebaut hat, um mit Graphem-Clustern zu arbeiten.

String-Indizierung dauert konstant, aber wenn Sie den n-ten Graphem-Cluster abrufen möchten, wird String-Indizierung das nicht für Sie tun.

(Menschen legen nahe, manchmal kanonische Zusammensetzung auf den String anwenden, aber es gibt viele mögliche Graphem-Cluster, die noch mehrere Codepunkte nach kanonischer Zusammensetzung nehmen.)

+0

Sind Python nicht 3 Saiten utf-8 codiert? Wie erhalten Sie einen Codepunkt aus einer utf-8-Zeichenfolge in O (1) -Zeit? – sepp2k

+1

@ sepp2k: Nein. Sie sind nicht. Innerhalb einer Zeichenfolge werden Codepunkte in einem Format mit fester Breite gespeichert. Ob dieses Format 1, 2 oder 4 Byte pro Codepunkt ist, hängt von der Zeichenfolge ab. – user2357112

+0

Ich verstehe. Vielen Dank. – sepp2k

Verwandte Themen