2010-12-05 12 views
0

Ich arbeite Huffman-Codierung von jeder .TXT-Datei, also zuerst muss ich diese Textdatei analysieren. Ich muss es lesen und dann analysieren. ich brauche "exit" wie Tabelle:.txt-Datei lesen und analysieren


Brief | Häufigkeit (wie oft dieselbe wiederholt wird) | Huffman-Code (dies wird später kommen)


Ich begann mit:

f = open('test.txt', 'r') #open test.tx 
for lines in f: 
    print lines   #to ensure if all work... 

Wie kann ich bestellen Zeichen aus der Datei in alphabetischer Reihenfolge zu lesen:

with open("test.txt") as f_in: 
    for line in f_in: 
     for char in line: 
      frequencies[char] += 1 

?? Vielen Dank


Well I tried like this: 
frequencies = collections.defaultdict(int) 
with open("test.txt") as f_in: 
    for line in f_in: 
     for char in line: 
      frequencies[char] += 1 


frequencies = [(count, char) for char, count in frequencies.iteritems()] 
frequencies.sort(key=operator.itemgetter(1)) 

Aber Compiler zurückgeben mir einen "Fehler" Code eingeben hier

Ich brauche diese alphabetische Reihenfolge in for-Schleife, nicht am Ende bei Frequenzen ...

+0

Haben Sie Einwände gegen diese Hausaufgaben? –

+0

sehe meine aktualisierte Antwort. – aaronasterling

+1

Ich sehe Probleme mit dem, was Sie versucht haben. Die letzten beiden Zeilen haben ein führendes Leerzeichen und es gibt keine 'Import-Collections' und' Import-Operator'-Anweisungen. Fix diese und es sollte gut funktionieren. – martineau

Antwort

2

Um Ihre Tabelle der Frequenzen, würde ich eine defaultdict verwenden. Dies wird nur einmal über die Daten iterieren.

import collections 
import operator 

frequencies = collections.defaultdict(int) 
with open(filename) as f_in: 
    for line in f_in: 
     for char in line: 
      frequencies[char] += 1 


frequencies = [(count, char) for char, count in frequencies.iteritems()] 
frequencies.sort(key=operator.itemgetter(1)) 
+0

Das ist im Grunde, wie ich es gemacht habe, als ich selbst eine Huffman-Implementierung geschrieben habe. (Außer meinem Text "Symbole" waren keine einzelnen Zeichen ...;)) –

+0

Vielen Dank @Aaronasterling für jetzt, Sie rocken;) – thaking

+0

@thaking, ich weiß wirklich nicht viel über Python. Sie können besser eine neue Frage erstellen, damit die Experten sie sehen können. – aaronasterling

0
with open('test.txt') as f: data = f.read() 
table = dict((c, data.count(c)) for c in set(data)) 
+0

Nur um klar zu sein, wird dies für jedes Zeichen, das in der Datei vorkommt, einmal über "Daten" iterieren. – aaronasterling

+0

Und eine zusätzliche Zeit, um das Set zu erstellen. Es ist auf Sauberkeit ausgerichtet, nicht auf Effizienz. –

0

Ich habe diese Lösung ein collections.Counter() mit:.

import re 
import collections 


if __name__ == '__main__': 
    is_letter = re.compile('[A-Za-z]') 

    frequencies = collections.Counter() 
    with open(r'text.txt') as f_in: 
     for line in f_in: 
      for char in line: 
       if is_letter.match(char): 
        frequencies[char.lower()] += 1 

    # Sort characters 
    characters = [x[0] for x in frequencies.most_common()] 
    characters.sort() 
    for c in characters: 
     print c, '|', str(frequencies[c]) 

Der reguläre Ausdruck is_letter nur zum Filtern verwendet wird, für die Zeichen in uns interessiert Es Ausgang gibt, der so aussieht.

a | 177 
b | 29 
c | 7 
d | 167 
e | 374 
f | 58 
g | 100 
h | 44 
i | 135 
j | 21 
k | 64 
l | 125 
m | 85 
n | 191 
o | 105 
p | 34 
r | 185 
s | 130 
t | 146 
u | 34 
v | 68 
x | 1 
y | 14 
Verwandte Themen