Mehrere Methoden für Python, um die entsprechenden Positionen von Buchstaben im Alphabet und Leistungsvergleich zu ermitteln
In einigen Fällen müssen wir die Reihenfolge der Buchstaben im Alphabet ermitteln, A = 1, B = 2 , C = 3 usw., zum Beispiel diese Frage https://projecteuler.net/problem=42 Einer der Schritte zur Lösung des Problems besteht darin, die Buchstaben in die entsprechende Reihenfolge im Alphabet umzuwandeln.
Der einfachste Weg, die entsprechende Position eines Buchstabens im Alphabet zu ermitteln, ist:
Verwenden Sie die Methode str.index oder str.find:
In [137]: "ABC".index('B') Out[137]: 1In [138]: "ABC".index('B')+1Out[138]: 2#或者在前面填充一个字符,这样index就直接得到字母序号: In [139]: "_ABC".index("B") Out[139]: 2
I I Ich habe auch darüber nachgedacht, das Alphabet in eine Liste oder ein Tupel umzuwandeln und es dann zu indizieren. Vielleicht wird die Leistung verbessert? Oder ist es eine gute Idee, die aus Buchstaben und Zahlen bestehenden Schlüsselwerte in einem Wörterbuch zu speichern?
Ich habe vor zwei Tagen auch eine Methode erkannt:
In [140]: ord('B')-64 Out[140]: 2
ord und chr sind beide in Python integrierte Funktionen, die ASCII-Zeichen in entsprechende Zeichen in der ASCII-Tabelle konvertieren können number, chr kann die Seriennummer in eine Zeichenfolge umwandeln.
Die Großbuchstaben in der Tabelle beginnen bei 65, minus 64 ist genau die Position der Großbuchstaben in der Tabelle. Kleinbuchstaben beginnen bei 97 und alles, was kleiner als 96 ist, ist die entsprechende Alphabetposition.
Welcher Ansatz könnte hinsichtlich der Leistung besser sein? Ich habe den Code geschrieben, um ihn zu testen:
az = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"_az = "_ABCDEFGHIJKLMNOPQRSTUVWXYZ"azlist = list(az) azdict = dict(zip(az,range(1,27))) text = az*1000000 #这个是测试数据#str.find和str.index的是一样的。这里就没必要写了。def azindexstr(text): for r in text: az.index(r)+1 passdef _azindexstr(text): for r in text: _az.index(r) passdef azindexlist(text): for r in text: azlist.index(r) passdef azindexdict(text): for r in text: azdict.get(r) passdef azindexdict2(text): for r in text: azdict[r] passdef azord(text): for r in text: ord(r)-64 passdef azand64(text): for r in text: ord(r)%64 pass
Kopieren Sie den obigen Code, fügen Sie ihn in ipython ein und verwenden Sie dann die magische Funktion %timeit, um die Leistung jeder Methode zu testen. ipython ist ein interaktiver Python-Interpreter, der über eine Vielzahl sehr praktischer Funktionen verfügt, wie beispielsweise die %timeit-Funktion, die hauptsächlich für Text verwendet wird. Bitte geben Sie pip install ipython ein, um zu installieren.
Das Folgende sind die Ergebnisdaten meines Tests:
In [147]: %timeit azindexstr(text) 1 loop, best of 3: 9.09 s per loop In [148]: %timeit _azindexstr(text) 1 loop, best of 3: 8.1 s per loop In [149]: %timeit azindexlist(text) 1 loop, best of 3: 17.1 s per loop In [150]: %timeit azindexdict(text) 1 loop, best of 3: 4.54 s per loop In [151]: %timeit azindexdict2(text) 1 loop, best of 3: 1.99 s per loop In [152]: %timeit azord(text) 1 loop, best of 3: 2.94 s per loop In [153]: %timeit azand64(text) 1 loop, best of 3: 4.56 s per loop
Aus den Ergebnissen ist ersichtlich, dass list.index am langsamsten ist, was überraschend ist Mich. Wenn die Liste außerdem viele Daten enthält, ist der Index sehr langsam. Die Geschwindigkeit von dict[r] ist schneller als die von dict.get(r), aber wenn es sich um einen nicht vorhandenen Schlüssel handelt, meldet dict[r] einen Fehler, während die Methode dict.get keinen Fehler meldet hat eine bessere Fehlertoleranz.
Die ord(r)-64-Methode ist schnell und sollte am bequemsten zu verwenden sein, da keine Daten erstellt werden müssen.