2009-12-08 8 views
5
#!/usr/bin/python 

import random 
import string 

appendToFile = open("appendedFile", "a") 

# Generator 

for i in range(1, 100000): 

    chars = "".join([random.choice(string.letters) for i in xrange(15)]) 
    chars2 = "".join([random.choice(string.letters) for i in xrange(15)]) 

    appendToFile.write(chars + ":" + chars2 + "\n") 

appendToFile.close() 

Code geändert von this question.Schnell eine große Datei über Python alphabetisch nummerieren

Der obige Code generiert 100.000 Zeilen mit zufälligem Text im Format STRING: STRING. Die resultierende Textdatei ist 3,1 MB.

Wie würde man die Datei schnell alphabetisieren, indem man den ersten STRING in STRING: STRING verwendet? Fall ist irrelevant.

Blasensortieren ist sehr langsam, nein?

+1

Sind wir Vorteil aus der Tatsache zu nehmen, dass diese in RAM auf modernen Maschinen passen, oder benötigen Sie eine Routine wie die reale Unix Art (1) Befehl, der aus Zwischenergebnisse auf der Festplatte zwischengespeichert werden können und so arbeiten auf Dateien von unbegrenzter Größe? –

+0

Vorteil von überschüssigem RAM. – torger

Antwort

5

Dies ist sehr schnell (unter 1 Sekunde auf meinem Computer). Es wird eine Sortierung ohne Berücksichtigung der Groß-/Kleinschreibung verwendet, die davon ausgeht, was Sie unter "Fall ist irrelevant" verstehen.

#!/usr/bin/python 

appendToFile = open("appendedFile", "r") 
sortToFile = open("sortedFile", "w") 

for line in sorted(appendToFile, key = str.lower): 
    sortToFile.write(line) 
+2

Warum nicht nur:' ... sortiert (..., key = str.lower) '? –

8

Der offensichtliche erste Ansatz besteht darin, einfach die integrierte Sortierfunktion in Python zu verwenden. Hast du das nicht im Sinn? Wenn nicht, warum? Mit nur 100.000 Zeilen zufälligem Text wäre die eingebaute Sortierung sehr schnell.

lst = open("appendedFile", "rt").readlines() 
lst.sort(key=str.lower) 

Fertig. Wir könnten es als Einzeiler tun, wenn Sie wirklich wollte:

lst = sorted(open("appendedFile", "rt").readlines(), key=str.lower) 

EDIT: Ich habe überprüft, und strings.letters sowohl Groß- und Kleinbuchstaben. Daher wird der obige Code so geändert, dass die Groß- und Kleinschreibung nicht berücksichtigt wird.

EDIT: mehr auf in Python Sortierung: http://wiki.python.org/moin/HowTo/Sorting

+0

Wenn nicht, warum? - Neu bei Python XD. Ich habe diesen Code erstellt, damit Sie über eine Datei verfügen, von der aus gearbeitet werden kann. – torger

+0

FYI, die integrierte Python-Sortierung für Listen ist eine Zusammenführungssortierung. Komplexität O (n * log n). – BrainCore

1

starten (Groß- und Kleinschreibung):

l=file(appendedFile).readlines() 
l.sort(key=lambda x:x.lower()) 

Für diese Arten von Größen Optimalisierung sind nicht wirklich notwendig (Timings auf meinem langsamen Rechner ;-) :

[email protected]:~$ time python -c "l=file('appendedFile').readlines();l.sort(key=lambda x:x.lower())" 

real 0m0.615s 
user 0m0.576s 
sys 0m0.024s 
+0

Danke für den Zeitmechanismus - wusste nicht, dass es existiert. – torger

+0

Der Befehl "time" ist unter Linux verfügbar. Es ist wahrscheinlich unter Mac OS X verfügbar. Sie können es auch für Windows bekommen, aber Microsoft hat es nicht eingebaut. Der einfachste Weg, es für Windows zu bekommen, ist Cygwin zu installieren. Ein rein Python-basierter Ansatz, der also portabel ist, ist die Verwendung des "timeit" -Moduls: http://docs.python.org/library/timeit.html – steveha

+0

@CrhistopheD, Sie brauchen die "Lambda" -Funktion nicht ; Sie können einfach verwenden: 'key = str.lower' – steveha