Hier ist der Code für meine Funktion:
%Vor%Im Moment arbeite ich mit einer Liste von über 87.000 Wörtern und dieser Algorithmus ist offensichtlich extrem langsam.
Gibt es einen besseren Weg, dies zu tun?
BEARBEITEN:
Ich habe die Algorithmen @ExP getestet, die mit der folgenden Klasse geliefert wurden:
%Vor%Die Ausgabe war (für eine Liste von 200 Wörtern):
%Vor%Überraschenderweise waren Generator und Count sogar langsamer als das Original (bitte lassen Sie mich wissen, wenn meine Implementierung falsch war).
Ich möchte @ Johns Lösung testen, weiß aber nichts über Bäume.
Da Sie sich nur mit dem Verhältnis von Vokalen zu Buchstaben in jedem Wort beschäftigen, könnten Sie zuerst alle Vokale durch a
ersetzen. Jetzt können Sie ein paar Dinge ausprobieren, die schneller sein könnten:
a
) zum Nicht-Vokal wechseln. Dies ist eine Baumstruktur. Die Anzahl der Buchstaben im Wort ist die Ebene des Baumes. Die Anzahl der Vokale ist die Anzahl der linken Zweige. Sie sollten die innerste Schleife optimieren.
Ich bin mir ziemlich sicher, dass es mehrere alternative Ansätze gibt. Hier ist, was ich im Moment herausfinden kann. Ich bin nicht sicher, wie sie in der Geschwindigkeit (in Bezug aufeinander und zu Ihrer Lösung) vergleichen werden.
Verwenden eines Generatorausdrucks:
%Vor% Verwenden von str.count()
:
Verwendung von str.translate()
(vorausgesetzt, es gibt keine Großbuchstaben oder Sonderzeichen):
Mit all diesen können Sie sogar die gesamte Funktion in einer einzigen Zeile ohne list.append()
schreiben.
Ich wäre neugierig zu wissen, was sich am schnellsten herausstellt.
Verwenden Sie einen regulären Ausdruck, um die Liste der Vokale zu vergleichen und die Anzahl der Übereinstimmungen zu zählen.
%Vor%So berechnen Sie es mit einer Befehlszeile unter Linux: -
cat wordlist.txt | tr -d aeiouAEIOU | paste - wordlist.txt | gawk '{ FS="\t"; RATIO = length()/ length(); print , RATIO }'
Ausgabe:
%Vor% Hinweis: Jede Zeile in wordlist.txt
enthält ein Wort. Leere Zeilen erzeugen einen Fehler durch Division durch Null
Tags und Links python